рдиреЗрдЯрд╡рд░реНрдХ рдХреИрдорд░реЛрдВ рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛, рднрд╛рдЧ 1

рдиреЗрдЯрд╡рд░реНрдХ рд╡реАрдбрд┐рдпреЛ рдХреИрдорд░реЗ рдзреАрд░реЗ-рдзреАрд░реЗ рдПрдирд╛рд▓реЙрдЧ рдХреА рдЬрдЧрд╣ рд▓реЗ рд░рд╣реЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдм рд╡реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд╣рдВрдЧреЗ рд╣реИрдВред рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдХреЗ рдХрдИ рд╕реНрдкрд╖реНрдЯ рд▓рд╛рдн рд╣реИрдВ:

рд╣рдо рдРрд╕реЗ рдХреИрдорд░реЛрдВ рд╕реЗ рдЪрд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡реЗ рдЖрдо рддреМрд░ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ? рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рдХреИрдорд░реЗ рдореМрдЬреВрджрд╛ рдорд╛рдирдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рдЪреАрдиреА рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪреЗрдВрдЧреЗред рдХреИрдорд░реЛрдВ рдХреЗ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рд╡реАрдбрд┐рдпреЛ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреЗ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпреЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ HTTP рдкрд░ Motion JPEG, RTSP рдкрд░ Motion JPEG рдпрд╛ RTSP рдкрд░ H264 рд╣реИрдВред рд╕рд╛рде рд╣реА, рдХрдИ рдХреИрдорд░реЗ рдзреНрд╡рдирд┐ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдиреЗрдЯрд╡рд░реНрдХ рдХреИрдорд░реЛрдВ рд╕реЗ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЗрди рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛, рдФрд░ рдореИрдВ рдЙрди рд╕рднреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдПрдХ рд╣реА рдкрд╛рдпрдерди рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рднреА рджреВрдВрдЧрд╛ред

HTTP рдкрд░ MJPEG


рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ HTTP рдкрд░ MJPEG рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдлрд╝реНрд░реЗрдо рдХреЛ рд╡рд┐рд╢реЗрд╖ рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддреИрдпрд╛рд░ рдЬреЗрдкреАрдИрдЬреА рдлрд╛рдЗрд▓реЗрдВ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИрдВред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рд╢реЗрд╖ MIME рдкреНрд░рдХрд╛рд░ рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдХрдИ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рд╣рдо рдорд┐рд╢реНрд░рд┐рдд рдФрд░ рдПрдХреНрд╕-рдорд┐рд╢реНрд░рд┐рдд-рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдЙрдирдХреЗ рдмреАрдЪ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреЛрдИ рдорддрднреЗрдж рдирд╣реАрдВ рд╣реИрдВ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВрдЧреЗред рдЕрдВрддрд░ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рд╣реИ: рдорд┐рд╢реНрд░рд┐рдд рдмрд╕ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рднрд╛рдЧреЛрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдпреЗ рднрд╛рдЧ рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд╕рдВрдпреБрдХреНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ; рдФрд░ x- рдорд┐рд╢реНрд░рд┐рдд-рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдкреНрд░рдХрд╛рд░ рд╕реАрдзреЗ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдХреЛ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рдЕрдкрдбреЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдирд╛рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ "x" рдЕрдХреНрд╖рд░ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрдкреВрд░реНрдгрддрд╛ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

HTTP рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдореЗрдВ, MIME рдкреНрд░рдХрд╛рд░ Content-Type рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 Content-Type: multipart/mixed; boundary="some_boundary" 

рдпрд╛

 Content-Type: multipart/x-mixed-replace; boundary=other_boundary 

рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рдкреИрд░рд╛рдореАрдЯрд░ boundary , рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдкрд╛рда рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд┐рднрд╛рдЬрдХ рдореЗрдВ рджреЛ рд╣рд╛рдЗрдлрд╝рди рднреА рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рднрд╛рдЬрдХ рд╕рдВрджреЗрд╢ рдореЗрдВ рд╕реНрд╡рдпрдВ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ Content-Size рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

HTTP рдкрд░ MJPEG рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:

 HTTP/1.0 200 OK Connection: close Server: MJPG-Streamer/0.2 Cache-Control: no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0 Pragma: no-cache Expires: Mon, 3 Jan 2000 12:34:56 GMT Content-Type: multipart/x-mixed-replace;boundary=boundarydonotcross --boundarydonotcross Content-Type: image/jpeg Content-Length: 23950 X-Timestamp: 0.000000 %Binary JPEG% --boundarydonotcross Content-Type: image/jpeg Content-Length: 24756 X-Timestamp: 0.000000 %Binary JPEG% --boundarydonotcross Content-Type: image/jpeg Content-Length: 23950 X-Timestamp: 0.000000 %Binary JPEG% 

рдпрд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдкрдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреИрдорд░рд╛ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЖрдк рдпрд╛ рддреЛ рдПрдХ рд╕реНрдирд┐рдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдореИрдВ рд╡рд╛рдпрд░рд╢рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ) рдпрд╛ рдЯреЗрд▓рдиреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреИрдорд░реЗ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 $ telnet 192.168.0.50 80 Trying 192.168.0.50.. Connected to 192.168.0.50. Escape character is '^]'. GET /jpeg HTTP/1.1 

GET рд▓рд╛рдЗрди рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЦрд╛рд▓реА рд▓рд╛рдЗрди рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд╢реАрд░реНрд╖рдХ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИред рдФрд░ "/ jpeg" рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреЛ рдЙрд╕ рдЕрдиреБрд░реЛрдз рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрдкрдХрд╛ рдХреИрдорд░рд╛ MJPEG рднреЗрдЬрддрд╛ рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, %Binary JPEG% рдЙрд╕ рдЬрд╛рдирдХрд╛рд░реА рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ рдЬреЛ рд╣рдо рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ - рдПрдХ рдЬреЗрдкреАрдИрдЬреА рдЫрд╡рд┐ред рд╣рдореЗрдВ рдЗрд╕реЗ рдзрд╛рд░рд╛ рд╕реЗ рдЪреБрдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢реБрд░реБрдЖрдд рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рдирдХ HTTP рд╣реЗрдбрд░ рд╣реИред Connection рдпрд╛ рддреЛ close рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ keep-alive , рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред рд╢реАрд░реНрд╖рдХ рд╕реЗ, рд╣рдореЗрдВ рд╕рд┐рд░реНрдл рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: 200 рдУрдХреЗ рдХреА рд╕реНрдерд┐рддрд┐ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛, рдЬреЛ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рдЕрдм рдПрдХ рдкрдХреНрд╖реА рдЙрдбрд╝ рдЬрд╛рдПрдЧрд╛; рдФрд░ boundary рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Content-Type ред

HTTP рд╣реЗрдбрд░ рдХреЗ рдмрд╛рдж (рдЦрд╛рд▓реА рд▓рд╛рдЗрди рдХреЗ рдмрд╛рдж) рдкреНрд░реЗрд╖рд┐рдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рд╢рд░реАрд░ рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдПрдХ рд╡рд┐рднрд╛рдЬрдХ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдПрдХ рдЦрд╛рд▓реА рд▓рд╛рдЗрди рдХреЗ рдмрд╛рдж рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╢реАрд░реНрд╖рдХ рдФрд░ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╢рд░реАрд░ рд╣реЛрддрд╛ рд╣реИред Content-Type: image/jpeg рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ JPEG рдЪрд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдлреНрд░реЗрдо рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ Content-Length (рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ 23950 рдмрд╛рдЗрдЯреНрд╕), рдФрд░ рд╡рд░реНрддрдорд╛рди рдлреНрд░реЗрдо рдХреЗ рд╕рдордп рдХрд╛ рдЯрд┐рдХрдЯ X-Timestamp рдореЗрдВ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдлреНрд░реЗрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╕рдордп рд╡рд░реНрддрдорд╛рди рдХрдВрдкреНрдпреВрдЯрд░ рдХрд╛ рд╕рдордп, рд▓реЗрдХрд┐рди X-Timestamp рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдлреНрд░реЗрдо рджрд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред

HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЕрдЬрдЧрд░ MJPEG


рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдкреНрд░рд╛рд░реВрдк рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЙрдирдХреЗ рд░рд┐рд╕реЗрдкреНрд╢рди рдХреЛ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЯреАрд╕реАрдкреА рд╡рд┐рднрд╛рдЬрди рднреА рдПрдХ рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИ, рдпрд╛ рдЗрд╕рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдгред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдИрдерд░рдиреЗрдЯ рдкрд░ рдПрдХ рдкреНрд░реЗрд╖рд┐рдд рд╕рдВрджреЗрд╢ ( MTU ) рдХрд╛ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ 1500 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣рдо рд╣рд░ рдмрд╛рд░ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдкреИрдХреЗрдЯ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдиреЗ рдкрд░ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╕реВрдЪрдирд╛ рдХреЛ рдЙрд╕рдХреЗ рдЖрдЧрдорди рдкрд░ рддреБрд░рдВрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдФрд░ рдкрд╛рд░реНрд╕рд░ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдФрд░ рдпрджрд┐ рдЖрдк рдЖрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдмрдлрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╕рдВрд╕рд╛рдзрди рдЦрдкрдд рдкрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИред рдпрд╣ рдмрдлрд╝рд░рд┐рдВрдЧ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдЧрд╛, рдЬрдм рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрдорд╛ рд╣реЛ рдЧрдИ рд╣реЛ (рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╣реЗрдбрд░ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП '\r\n\r\n' рддрдХ рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рддрдм рддрдХ рдЬрдм рддрдХ рд╕реАрдорд╛рдВрдХрдХ рджреЛ рдмрд╛рд░ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ, рдпрд╛ рдПрдХ рдЦрд╛рд▓реА рд▓рд╛рдЗрди рдХреЛ рднреА рдкрдврд╝реЗрдВ, рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЧрд┐рдиреЗрдВ)ред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдЖрдиреЗ рдкрд░ рддреБрд░рдВрдд рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред

рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдореЗрдВ рджреЛ рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВ: main.py рдФрд░ http_mjpeg_client.py ред рдкрд╣рд▓реЗ рдореЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ, рдХреИрдорд░реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреБрд░рдВрдд рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдпрд╣рд╛рдВ рд▓рд╛рдКрдВрдЧрд╛ред
main.py
 from twisted.internet import reactor from http_mjpeg_client import MJPEGFactory def processImage(img): 'This function is invoked by the MJPEG Client protocol' # Process image # Just save it as a file in this example f = open('frame.jpg', 'wb') f.write(img) f.close() def main(): print 'Python M-JPEG Over HTTP Client 0.1' # Define connection parameters, login and password are optional. config = {'request': '/mjpeg', 'login': 'admin', 'password': 'admin', 'ip': '127.0.0.1', 'port': 8080, 'callback': processImage} # Make a connection reactor.connectTCP(config['ip'], config['port'], MJPEGFactory(config)) reactor.run() print 'Python M-JPEG Client stopped.' # this only runs if the module was *not* imported if __name__ == '__main__': main() 

http_mjpeg_client.py
 from twisted.internet.protocol import Protocol, ClientFactory from base64 import b64encode import re debug = 1 class MJPEGClient(Protocol): def __init__(self): # A place for configuration parameters self.config = {} # I we are connected to a web server self.isConnected = False # The boundary in multipart stream self.boundary = '' # Actual image data goes here self.img = '' # Size of the image frame being downloaded self.next_img_size = 0 # Indicates that currently parsing a header self.isHeader = False def connectionMade(self): # Implement basic authorization if self.config['login']: authstring = 'Authorization: Basic ' + b64encode(self.config['login']+':'+self.config['password']) + '\r\n' else: authstring = '' # Form proper HTTP request with header to_send = 'GET ' + self.config['request'] + ' HTTP/1.1\r\n' + \ authstring + \ 'User-Agent: Python M-JPEG Client\r\n' + \ 'Keep-Alive: 300\r\n' + \ 'Connection: keep-alive\r\n\r\n' # Send it self.transport.write(to_send) if debug: print 'We say:\n', to_send def dataReceived(self, data): if debug: print 'Server said:\n', len(data), 'bytes of data.' if not self.isConnected: # Response header goes before empty line data_sp = data.strip().split('\r\n\r\n', 1) header = data_sp[0].splitlines() # Parse header for line in header: if line.endswith('200 OK'): # Connection went fine self.isConnected = True if debug: print 'Connected' if line.startswith('Content-Type: multipart'): # Got multipart r = re.search(r'boundary="?(.*)"?', line) self.boundary = r.group(1) # Extract boundary if debug: print 'Got boundary:', self.boundary # If we got more data, find a JPEG there if len(data_sp) == 2: self.findJPEG(data_sp[1]) else: # If connection is alredy made find a JPEG right away self.findJPEG(data) def findJPEG(self, data): hasMoreThanHeader = False # If we know next image size, than image header is already parsed if not self.next_img_size: # Otherwise it should be a header first for line in data.splitlines(): if line == '--'+self.boundary: self.isHeader = True if debug: print 'Got frame header' elif line == '': if self.isHeader: # If we might have more data after a header in a buffer hasMoreThanHeader = True self.isHeader = False elif self.isHeader: # Here we can parse all the header information # But we are really interested only in one if line.startswith('Content-Length:'): self.next_img_size = int(line.split(' ')[1]) if debug: print 'Next frame size:', self.next_img_size else: # How many bytes left to read remains = self.next_img_size - len(self.img) self.img += data[:remains] # We got the whole image if len(self.img) == self.next_img_size: if debug: print 'Got a frame!' # Run a callback function self.config['callback'](self.img) # Reset variables self.img = '' self.next_img_size = 0 # If something left in a buffer if data[remains:]: self.findJPEG(data[remains:]) if hasMoreThanHeader: data_sp = data.split('\r\n\r\n', 1) # If there is something after a header in a buffer if len(data_sp) == 2: self.findJPEG(data_sp[1]) def connectionLost(self, reason): print 'Connection lost, reconnecting' self.isConnected = False self.img = '' self.next_img_size = 0 self.isHeader = 0 self.boundary = '' class MJPEGFactory(ClientFactory): def __init__(self, config): self.protocol = MJPEGClient self.config = config def buildProtocol(self, addr): prot = ClientFactory.buildProtocol(self, addr) # Weird way to pass the config parameters to the protocol prot.config = self.config return prot def clientConnectionLost(self, connector, reason): # Automatic reconnection connector.connect() 

рдореБрдЦреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╣рдо config рдбрд┐рдХреНрд╢рдирд░реА рдореЗрдВ рдХреИрдорд░реЗ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЯреНрд╡рд┐рд╕реНрдЯреЗрдб рдиреЗрдЯрд╡рд░реНрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рд░рд┐рдПрдХреНрдЯрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЗрдореЗрдЬреЗрдЬ рдХреЛ processImage() рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рдгрд╛рдореА рдлреНрд░реЗрдо рдХреЛ рдореМрдЬреВрджрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ frame.jpg рдирд╛рдо рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред

рдореИрдВрдиреЗ MJPEG рд╕реНрдЯреНрд░реАрдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЪрд▓рд╛рдпрд╛:
./mjpg_streamer -i "./input_testpicture.so" -o "./output_http.so -w ./www"
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ request /?action=stream рдмрд░рд╛рдмрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЙрдиреНрд╣реЛрдВрдиреЗ рд╡реЗрдмрдХреИрдо рд╕реЗ рдЪрд┐рддреНрд░ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ред

рдореИрдВрдиреЗ рджреВрд╕рд░реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рддрд╛рдХрд┐ рдкрд╛рдардХ рдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╣реЛ рдХрд┐ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреИрд╕реЗ рд╣реЛрддреА рд╣реИред рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдХреИрдорд░реЗ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдЬреЛ рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рдПрдХ рдЕрдкреАрд▓ рдХреЗ рд╕рд╛рде рдПрдХ HTTP рд╣реЗрдбрд░ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рднреЗрдЬрддрд╛ рд╣реИ, рдпрд╣ connectionMade() рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдЬрдм рднреА рдирдпрд╛ рдбреЗрдЯрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ dataReceived() рддреЛ dataReceived() рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ, рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЬреЗрдкреАрдИрдЬреА рдбреЗрдЯрд╛ рдХрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдЕрднреА рднреА рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреИрдорд░реЗ рдХреЗ HTTP рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реЗрдбрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рдо рдЗрд╕реЗ split('\r\n\r\n', 1) рдлрд╝рдВрдХреНрд╢рди split('\r\n\r\n', 1) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪреБрдирддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ (рд╕реНрдерд┐рддрд┐ рдФрд░ boundary рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рддреЗ рд╣реБрдП рдЕрд▓рдорд╛рд░рд┐рдпреЛрдВ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред )ред рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╣рдо рддреБрд░рдВрдд рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ findJPEG() рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╢рд╛рдЦрд╛рдХрд░рдг рднреА рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ JPEG рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рдЖрдВрддрд░рд┐рдХ рд╣реЗрдбрд░ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВ, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдбреЗрдЯрд╛ рд╕реАрдзреЗ рдПрдХ рдЬреЗрдкреАрдИрдЬреА рдЫрд╡рд┐ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЪрд░ self.img рдореЗрдВ рдбрд╛рд▓ self.img рдЬрдм рддрдХ рд╣рдо рд╕рднреА self.next_img_size рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ self.img ред рд╣рдо рдЫрд╡рд┐ рдХреЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ self.next_img_size , рдФрд░ рдЬрдм рд╣рдо рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░ рджреЗрддреЗ рд╣реИрдВред callback рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, рдФрд░ рдЙрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЫрд╡рд┐ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред

debug рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рд╕реВрдЪрдирд╛ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЖрдк рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЕрдЬрдЧрд░ рдПрдордЬреЗрдкреАрдИрдЬреА ред

рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП ...

рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА:


рдорд╛рдЗрдо
рдореЛрд╢рди рдЬреЗрдкреАрдИрдЬреА
HTTP рд╣реЗрдбрд░ рдХреА рд╕реВрдЪреА

рдкреБрдирд╢реНрдЪ: рдореИрдВрдиреЗ рд▓реЗрдЦ рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдмреЗрд╣рддрд░ рд╕рдордЭ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рднрд╛рд░ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ред

Source: https://habr.com/ru/post/In115808/


All Articles