
рдиреЗрдЯрд╡рд░реНрдХ рд╡реАрдбрд┐рдпреЛ рдХреИрдорд░реЗ рдзреАрд░реЗ-рдзреАрд░реЗ рдПрдирд╛рд▓реЙрдЧ рдХреА рдЬрдЧрд╣ рд▓реЗ рд░рд╣реЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдм рд╡реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд╣рдВрдЧреЗ рд╣реИрдВред рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдХреЗ рдХрдИ рд╕реНрдкрд╖реНрдЯ рд▓рд╛рдн рд╣реИрдВ:
- рдЕрд▓рдЧ рд░рд┐рдХреЙрд░реНрдбрд░ рдпрд╛ рдХреИрдкреНрдЪрд░ рдХрд╛рд░реНрдб рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ;
- рд╢реЛрд░ рдЙрдиреНрдореБрдХреНрддрд┐;
- рдореМрдЬреВрджрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдЖрд╕рд╛рди рдПрдХреАрдХрд░рдг;
- рдХреЛрдИ рджреВрд░реА рд╕реАрдорд╛ рдирд╣реАрдВ;
- рдЙрдЪреНрдЪ-рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреИрдорд░реЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐;
- рдХреИрдорд░реЗ рдХреЛ рдХреИрдорд░реЗ рд╕реЗ рд╕реАрдзреЗ рджреЗрдЦрдирд╛ http;
- рд╡рд┐рднрд┐рдиреНрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐;
- рдФрд░ рдЕрдиреНрдп
рд╣рдо рдРрд╕реЗ рдХреИрдорд░реЛрдВ рд╕реЗ рдЪрд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡реЗ рдЖрдо рддреМрд░ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ? рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рдХреИрдорд░реЗ рдореМрдЬреВрджрд╛ рдорд╛рдирдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рдЪреАрдиреА рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪреЗрдВрдЧреЗред рдХреИрдорд░реЛрдВ рдХреЗ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рд╡реАрдбрд┐рдпреЛ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреЗ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпреЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ 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
рдпрд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдкрдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреИрдорд░рд╛ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЖрдк рдпрд╛ рддреЛ рдПрдХ рд╕реНрдирд┐рдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдореИрдВ
рд╡рд╛рдпрд░рд╢рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ) рдпрд╛ рдЯреЗрд▓рдиреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреИрдорд░реЗ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
$ 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'
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):
рдореБрдЦреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╣рдо
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 рд╣реЗрдбрд░ рдХреА рд╕реВрдЪреАрдкреБрдирд╢реНрдЪ: рдореИрдВрдиреЗ рд▓реЗрдЦ рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдмреЗрд╣рддрд░ рд╕рдордЭ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рднрд╛рд░ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ред