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


рдЕрдкрдиреЗ рдкрд╣рд▓реЗ рд▓реЗрдЦ рдореЗрдВ, "рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рджреВрд░реА рдФрд░ рдЙрд╕рдХреА рдЧрддрд┐ рдХреЛ рдорд╛рдкрдирд╛," рдореИрдВрдиреЗ рд╡реАрдбрд┐рдпреЛрдХреИрдорд┐рдирдХреНрд╕ 2 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдФрд░ рдбрд╛рдпрд░реЗрдХреНрдЯрдПрдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реЗрдмрдХреИрдо рд╕реЗ рдЫрд╡рд┐рдпреЛрдВ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╛рдВрдЪ рдХреАред рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, "рдиреЗрдЯрд╡рд░реНрдХ рдХреИрдорд░реЛрдВ рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдХреИрдкреНрдЪрд░рд┐рдВрдЧ, рднрд╛рдЧ 1," рдореИрдВрдиреЗ рдЬрд╛рдВрдЪ рдХреА рдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдореЛрд╢рди-рдЬреЗрдкреАрдИрдЬреА рдХреИрдорд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЕрдм рдореИрдВ рдЖрдкрдХреЛ рдиреЗрдЯрд╡рд░реНрдХ RTSP рдХреИрдорд░реЛрдВ рд╕реЗ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, RTSP рдкрд░ Motion-JPEGред

рдпрд╣ рдХрд╛рд░реНрдп HTTP рд╕реЗ рдЕрдзрд┐рдХ рдЧрддрд┐-рдЬреЗрдкреАрдИрдЬреА рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЕрдзрд┐рдХ рдХрдиреЗрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдмрджрд▓реЗ рдореЗрдВ рд╣рдореЗрдВ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛рдкрди, рдЧрддрд┐, рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╣реБрдореБрдЦреА рдкреНрд░рддрд┐рднрд╛ рднреА рдорд┐рд▓рддреА рд╣реИред рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдЖрд░рдЯреАрдПрд╕рдкреА рд╕рд░рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрдорд╛рдиреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдРрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреА рдЬрд╣рд╛рдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

RTSP рдХреНрдпрд╛ рд╣реИ?


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

рд╡рд░реНрдХрд╣реЙрд░реНрд╕ рдПрдХ рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИ: рдЖрд░рдЯреАрдкреА - рд░реАрдпрд▓-рдЯрд╛рдЗрдо рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ - рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ред рдЗрд╕рдХреА рдорджрдж рд╕реЗ, рд╣рдореЗрдВ рдЬрд┐рд╕ рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╡рд╣ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрдЦрдж рд╣реИ, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд▓рд┐рдВрдХ рдкрд░рдд рдкрд░ рд╡рд┐рдЦрдВрдбрди рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рдФрд░ рдЙрдкрдпреЛрдЧреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рднреА рд╡рд╣рди рдХрд░рддрд╛ рд╣реИ: рдкреНрд░реЗрд╖рд┐рдд рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рд╛рд░реВрдк, рд╕рдордп рдЯрд┐рдХрдЯ рдФрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдлрд╝реАрд▓реНрдб (рдпрджрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдСрдбрд┐рдпреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рдПрдХ рд╕рд╛рде рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ)ред рдпрджреНрдпрдкрд┐ рдпрд╣ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЯреАрд╕реАрдкреА рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдпреВрдбреАрдкреА рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдЧрддрд┐-рдЙрдиреНрдореБрдЦ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХрд╛рд░рдг рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╛рдиреА RTP рдбреЗрдЯрд╛ рдПрдХ UDP рдбреЗрдЯрд╛рдЧреНрд░рд╛рдо рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣реЗрдбрд░ рдФрд░ рдкреЗрд▓реЛрдб рдбреЗрдЯрд╛ рдореАрдбрд┐рдпрд╛ рдХрдВрдЯреЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╣реИред

рдРрд╕рд╛ рд▓рдЧреЗрдЧрд╛ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рд╣рдо RTSP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ, рд╣рдо RTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдард╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣рд╛рдБ рдерд╛, рд╕реНрдорд╛рд░реНрдЯ рдЕрдВрдХрд▓ рдПрдХ рддреАрд╕рд░реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдЖрдП: RTCP - рд░реАрдпрд▓-рдЯрд╛рдЗрдо рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдХрдВрдЯреНрд░реЛрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ - рдПрдХ рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдХрдВрдЯреНрд░реЛрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ред рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реЗрд╡рд╛ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреА рдорджрдж рд╕реЗ рдЧреНрд░рд╛рд╣рдХ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдордЧреНрд░реА рдХрд┐рддрдиреА рдЕрдЪреНрдЫреА рдпрд╛ рдмреБрд░реА рд╣реИред рдЗрд╕ рдбреЗрдЯрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рд░реНрд╡рд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд┐рдЯ рджрд░ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЛрдбреЗрдХ рдкрд░ рднреА рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ RTP рдПрдХ рд╕рдо рдкреЛрд░реНрдЯ рдирдВрдмрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ RTCP рдЕрдЧрд▓реЗ рд╡рд┐рд╖рдо рдкреЛрд░реНрдЯ рдирдВрдмрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

RTSP рд╕рдВрдЪрд╛рд░ рдЙрджрд╛рд╣рд░рдг

рдореЗрд░реЗ рдкрд╛рд╕ рдЖрд░рдЯреАрдПрд╕рдкреА рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрд░реЛрдд рд╣реИ - рдПрд╡рд┐рдбреЗрдВрд╕ рдПрдкреАрдПрдХреНрд╕ рдмреЙрдХреНрд╕ рдПрдо 1 рдХреИрдорд░рд╛, рдЗрд╕рд▓рд┐рдП рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдЗрд╕рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред

рдиреАрдЪреЗ VLC рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдХрд╛ рд▓реЙрдЧ рд╣реИ (рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рд╢реЛрдз рдореЗрдВ рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИ) рдФрд░ рдпрд╣ рдХреИрдорд░рд╛ред рдХреИрдорд░реЗ рдХреЗ 554 рдкреЛрд░реНрдЯ рдХреЛ рд╡реАрдПрд▓рд╕реА рд╕реЗ рдкрд╣рд▓рд╛ рдЕрдиреБрд░реЛрдзред рдЬрд╡рд╛рдм рдПрдХ рдЦрд╛рд▓реА рд▓рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИ рдФрд░ "рдЖрд░рдЯреАрдПрд╕рдкреА / 1.0" рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред

01: OPTIONS rtsp://192.168.0.254/jpeg RTSP/1.0 02: CSeq: 1 03: User-Agent: VLC media player (LIVE555 Streaming Media v2008.07.24) 04: 05: RTSP/1.0 200 OK 06: CSeq: 1 07: Date: Fri, Apr 23 2010 19:54:20 GMT 08: Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE 09: 10: DESCRIBE rtsp://192.168.0.254/jpeg RTSP/1.0 11: CSeq: 2 12: Accept: application/sdp 13: User-Agent: VLC media player (LIVE555 Streaming Media v2008.07.24) 14: 15: RTSP/1.0 200 OK 16: CSeq: 2 17: Date: Fri, Apr 23 2010 19:54:20 GMT 18: Content-Base: rtsp://192.168.0.254/jpeg/ 19: Content-Type: application/sdp 20: Content-Length: 442 21: x-Accept-Dynamic-Rate: 1 22: 23: v=0 24: o=- 1272052389382023 1 IN IP4 0.0.0.0 25: s=Session streamed by "nessyMediaServer" 26: i=jpeg 27: t=0 0 28: a=tool:LIVE555 Streaming Media v2008.04.09 29: a=type:broadcast 30: a=control:* 31: a=range:npt=0- 32: a=x-qt-text-nam:Session streamed by "nessyMediaServer" 33: a=x-qt-text-inf:jpeg 34: m=video 0 RTP/AVP 26 35: c=IN IP4 0.0.0.0 36: a=control:track1 37: a=cliprect:0,0,720,1280 38: a=framerate:25.000000 39: m=audio 7878 RTP/AVP 0 40: a=rtpmap:0 PCMU/8000/1 41: a=control:track2 42: 43: 44: SETUP rtsp://192.168.0.254/jpeg/track1 RTSP/1.0 45: CSeq: 3 46: Transport: RTP/AVP;unicast;client_port=41760-41761 47: User-Agent: VLC media player (LIVE555 Streaming Media v2008.07.24) 48: 49: RTSP/1.0 200 OK 50: CSeq: 3 51: Cache-Control: must-revalidate 52: Date: Fri, Apr 23 2010 19:54:20 GMT 53: Transport: RTP/AVP;unicast;destination=192.168.0.4;source=192.168.0.254;client_port=41760-41761; server_port=6970-6971 54: Session: 1 55: x-Transport-Options: late-tolerance=1.400000 56: x-Dynamic-Rate: 1 57: 58: SETUP rtsp://192.168.0.254/jpeg/track2 RTSP/1.0 59: CSeq: 4 60: Transport: RTP/AVP;unicast;client_port=7878-7879 61: Session: 1 62: User-Agent: VLC media player (LIVE555 Streaming Media v2008.07.24) 63: 64: RTSP/1.0 200 OK 65: CSeq: 4 66: Cache-Control: must-revalidate 67: Date: Fri, Apr 23 2010 19:54:20 GMT 68: Transport: RTP/AVP;unicast;destination=192.168.0.4;source=192.168.0.254;client_port=7878-7879; server_port=6972-6973 69: Session: 1 70: x-Transport-Options: late-tolerance=1.400000 71: x-Dynamic-Rate: 1 72: 73: PLAY rtsp://192.168.0.254/jpeg/ RTSP/1.0 74: CSeq: 5 75: Session: 1 76: Range: npt=0.000- 77: User-Agent: VLC media player (LIVE555 Streaming Media v2008.07.24) 78: 79: RTSP/1.0 200 OK 80: CSeq: 5 81: Date: Fri, Apr 23 2010 19:54:20 GMT 82: Range: npt=0.000- 83: Session: 1 84: RTP-Info: url=rtsp://192.168.0.254/jpeg/track1;seq=20730; rtptime=3869319494,url=rtsp://192.168.0.254/jpeg/track2;seq=33509;rtptime=3066362516 85: 86: #              87: 88: TEARDOWN rtsp://192.168.0.254/jpeg/ RTSP/1.0 89: CSeq: 6 90: Session: 1 91: User-Agent: VLC media player (LIVE555 Streaming Media v2008.07.24) 92: 93: RTSP/1.0 200 OK 94: CSeq: 6 95: Date: Fri, Apr 23 2010 19:54:25 GMT 

рдкрд╣рд▓реА рдмрд╛рдд рд╡реАрдПрд▓рд╕реА рдиреЗ рдХреИрдорд░реЗ рд╕реЗ рдкреВрдЫрд╛:
"рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?" (рд╡рд┐рдХрд▓реНрдк)
- рдЖрдкрдХреЛ рдирдорд╕реНрдХрд╛рд░ рд╣реИред рдФрд░ рдХреНрдпрд╛ рдЖрдк рдореБрдЭрд╕реЗ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк, DESCRIBE, SETUP, TEARDOWN, PLAY рдФрд░ PAUSE рдХрд░рдиреЗ рдХреЛ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред
- рдареАрдХ рд╣реИ, рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ "/ jpeg" рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реИ? (рд╡рд░реНрдгрди)
- рдпрд╣рд╛рдБ рдореИрдВ рдкрд╣рд▓реЗ рдЯреНрд░реИрдХ рдореЗрдВ рд╡реАрдбрд┐рдпреЛ, рдПрдо-рдЬреЗрдкреАрдИрдЬреА, рдФрд░ рджреВрд╕рд░реЗ рдЯреНрд░реИрдХ рдореЗрдВ рдСрдбрд┐рдпреЛ рд╕рд░рд▓ рд╣реИред
- рд╡реАрдбрд┐рдпреЛ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдкрд╣рд▓рд╛ рдЯреНрд░реИрдХ, рдЗрд╕реЗ рдореБрдЭреЗ рдбрд╛рд▓реЗрдВ, рдХреГрдкрдпрд╛ рдкреЙрдХреЗрдЯ рдирдВрдмрд░ 41760 рдореЗрдВ, рдФрд░ рдЖрдк рдкреЙрдХреЗрдЯ рдирдВрдмрд░ 41761 рдореЗрдВ рдХрд┐рд╕реА рднреА рднреВрд╕реА рдХреЛ рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВред (SETUP track1)
"рдареАрдХ рд╣реИ, рдЖрдкрдХреА рдЖрдЬреНрдЮрд╛ рдкрд░ ..."
- рдФрд░ рдореИрдВ рднреА рдзреНрд╡рдирд┐ рд╕реБрдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, 7878, 7879 рдЬреЗрдм рдореЗрдВ рдПрдХ рджрд╛рдиреЗред (SETUP track2)
- рд╣рд╛рдВ, рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВред
- рдареАрдХ рд╣реИ, рдЫрд┐рдбрд╝рдХрд╛ рд╣реБрдЖред (PLAY)
рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж:
- рдареАрдХ рд╣реИ, рдкрд░реНрдпрд╛рдкреНрдд, рдореИрдВрдиреЗ рдкрд░реНрдпрд╛рдкреНрдд рджреЗрдЦрд╛ рд╣реИред (рдЯрд┐рдпрд░рдбрд╛рдЙрди)
- рдЬреИрд╕рд╛ рдЖрдк рдХрд╣реЗрдВред

рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдереЛрдбрд╝рд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ, " OPTIONS rtsp://192.168.0.254/jpeg RTSP/1.0 " " GET /jpeg HTTP/1.1 " рд╕реЗ рдорд┐рд▓рддрд╛-рдЬреБрд▓рддрд╛ рд╣реИ, рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдХрд┐ рдЗрд╕ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдФрд░ HTTP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рд╡рд┐рдХрд▓реНрдк рд╡рд┐рдзрд┐ рднреА рд╣реИред рдпрд╣рд╛рдБ 192.168.0.254 рдореЗрд░реЗ рдХреИрдорд░реЗ рдХрд╛ рдЖрдИрдкреА рдкрддрд╛ рд╣реИред CSeq рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рдорд╛рди CSeq рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдФрд░ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ " RTSP/1.0 200 OK " рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдпрд╣ " HTTP/1.1 200 OK " рдХреА рддрд░рд╣ рд╣реИ - рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ: рдЕрдиреБрд░реЛрдз рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреБрд░реЛрдз рд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереАред рдФрд░ рд╕рд╛рджреЗ рдкрд╛рда рдореЗрдВ рд╕рднреА рдЙрдкрд▓рдмреНрдз рддрд░реАрдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИред

рдЕрдЧрд▓рд╛, рд╣рдо рдЕрдиреБрд░реЛрдз / рдЬреЗрдкреАрдИрдЬреА рдкрд░ рд╣рдореЗрдВ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЕрднреА рдЙрд╕рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд┐рдпрд╛ рд╣реИ рдФрд░ " rtsp://192.168.0.254/jpeg " рд▓рд┐рдВрдХ рдкрд░ рдЖрдпрд╛ рд╣реИред рд╣рдо рдпрд╣ рднреА рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдПрд╕рдбреАрдкреА (рдкрдВрдХреНрддрд┐ 12) рдХреЗ рд░реВрдк рдореЗрдВ рдЙрддреНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╣рдореЗрдВ рдПрдХ RTSP рд╣реЗрдбрд░ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ Content-Type рдФрд░ Content-Length рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╣реЗрдбрд░ рдХреЗ рдмрд╛рдж, рдЦрд╛рд▓реА рд▓рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдПрд╕рдбреАрдкреА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рд╕реАрдзреЗ рд╣реЛрддреА рд╣реИ:

 v=0 o=- 1272052389382023 1 IN IP4 0.0.0.0 s=Session streamed by "nessyMediaServer" i=jpeg t=0 0 a=tool:LIVE555 Streaming Media v2008.04.09 a=type:broadcast a=control:* a=range:npt=0- a=x-qt-text-nam:Session streamed by "nessyMediaServer" a=x-qt-text-inf:jpeg m=video 0 RTP/AVP 26 c=IN IP4 0.0.0.0 a=control:track1 a=cliprect:0,0,720,1280 a=framerate:25.000000 m=audio 7878 RTP/AVP 0 a=rtpmap:0 PCMU/8000/1 a=control:track2 

рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИред рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 #   m=video 0 RTP/AVP 26 #   RTP/AVP,  ,   26,   Motion-JPEG a=control:track1 #   a=cliprect:0,0,720,1280 #    a=framerate:25.000000 #       #   m=audio 7878 RTP/AVP 0 #  7878,    , 0 - PCM a=control:track2 #   

рдпрджрд┐ рд╣рдо рдХреЗрд╡рд▓ рд╡реАрдбрд┐рдпреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдСрдбрд┐рдпреЛ рдбреЗрдЯрд╛ рд╕реЗ рд╣рдо рдЯреНрд░реИрдХ рдХреЗ рдирд╛рдо рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рдм рдХреБрдЫ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреЗрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рднреА рд╣рдореЗрдВ рдЗрд╕ рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдк рдСрдбрд┐рдпреЛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ (рдпрджрд┐ SETUP рдХреЗрд╡рд▓ рд╡реАрдбрд┐рдпреЛ рдЯреНрд░реИрдХ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ SETUP рд╣реИ) рддреЛ рдХреИрдорд░рд╛ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджреЗрддрд╛ рд╣реИред

рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо (7878) рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ рдирдВрдмрд░ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдХреИрдорд░реЗ рдХреИрд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕реЗ SETUP рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред

рдЕрдЧрд▓реЗ рджреЛ SETUP рдЕрдиреБрд░реЛрдз рд╣реИрдВ, рдЬреЛ рдЙрди рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рди рдкрд░ рд╣рдо рд╡реАрдбрд┐рдпреЛ рдФрд░ рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рдирдВрдмрд░ RTP рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ рд╣реИ, рджреВрд╕рд░рд╛ RTCP рдХреЗ рд▓рд┐рдП рд╣реИред рдХреИрдорд░реЗ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд╛рдорд░реНрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдореЗрдВ Session рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рднреА рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдореЗрдВ рдмрд╛рдж рдХреА рд╕рднреА рдХреЙрд▓ рдореЗрдВ рдЗрд╕рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдирд╛ рд╣реЛрдЧрд╛ред

PLAY рдХрдорд╛рдВрдб рдХреЗ рдмрд╛рдж, рд╡реАрдбрд┐рдпреЛ 41760 рдФрд░ рдСрдбрд┐рдпреЛ рдХреЛ 7878 рдкреЛрд░реНрдЯ рдкрд░ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ TEARDOWN рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде TEARDOWN рдкреНрд░рд╕рд╛рд░рдг рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХрдиреЗрдХреНрд╢рди рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

MJPEG RTP рдкрд░

рдЖрд░рдЯреАрдкреА рдкреИрдХреЗрдЯ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдореИрдВ рдпрд╣рд╛рдВ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрдХреЗрдЬ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рджреВрдВрдЧрд╛ред
+ рдмрд┐рдЯ рдСрдлрд╕реЗрдЯ0-1234-789-1516-31
0рд╡реАрдкреАрдПрдХреНрд╕рд╕реАрд╕реАрдПрдордкреАрдЯреАрдЕрдиреБрдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛
32рд╕рдордп-рдЪрд┐рд╣реНрди
64SSRC рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛
96... CSRC рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ ...
96+ (CC ├Ч 32)рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИрдбрд░ рдЖрдИрдбреАрдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИрдбрд░ рдХреА рд▓рдВрдмрд╛рдИ (EHL)
96+ (CC ├Ч 32) + (X ├Ч 32)... рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИрдбрд░ ...
96+ (CC ├Ч 32) + (X ├Ч 32) + (X ├Ч EHL)рдкреЗрд▓реЛрдб

  1. рд╡реА (рд╕рдВрд╕реНрдХрд░рдг): (2) рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рдВрд╕реНрдХрд░рдгред рдЕрдм рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ 2ред
  2. P (рдкреИрдбрд┐рдВрдЧ, рд╕рдкреНрд▓реАрдореЗрдВрдЯ): (1) RTP рдкреИрдХреЗрдЯ рдХреЛ рдЕрдВрдд рдореЗрдВ рдЦрд╛рд▓реА рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдЧрджреНрджреЗрджрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдПред
  3. рдПрдХреНрд╕ (рд╡рд┐рд╕реНрддрд╛рд░): (1) рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЗрдбрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  4. CC (CSRC рдХрд╛рдЙрдВрдЯ): (4) рдореЗрдВ CSRC рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рд╣рдо рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
  5. рдПрдо (рдорд╛рд░реНрдХрд░): (1) рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрддрд░ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдмрд┐рдЯ рдПрдХ рдкрд░ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдЖрд░рдЯреАрдкреА рдкреИрдХреЗрдЯ рдореЗрдВ рдЬреЗрдкреАрдИрдЬреА рдлреНрд░реЗрдо рдХрд╛ рдЕрдВрдд рд╣реЛрддрд╛ рд╣реИред
  6. рдкреАрдЯреА (рдкреЗрд▓реЛрдб рдкреНрд░рдХрд╛рд░): (7) рдкреЗрд▓реЛрдб рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ - рдкреНрд░реЗрд╖рд┐рдд рдбреЗрдЯрд╛ред MJPEG рдХреЗ рд▓рд┐рдП рдпрд╣ 26 рд╣реИред
  7. рдЕрдиреБрдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ : (16) рдЖрд░рдЯреАрдкреА рдкреИрдХреЗрдЯ рд╕рдВрдЦреНрдпрд╛, рдЦреЛрдП рд╣реБрдП рдкреИрдХреЗрдЯреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИред
  8. рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк (32): рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ 90,000 рд╣рд░реНрдЯреНрдЬ (90000 = 1 рд╕реЗрдХрдВрдб)ред
  9. SSRC (рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕реЛрд░реНрд╕): (32) рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝рд░ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдзрд╛рд░рд╛ рдХреЗ рд╕реНрд░реЛрдд рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред
  10. CSRC (рдпреЛрдЧрджрд╛рди рд╕реНрд░реЛрдд): (32) рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрд░реЛрддреЛрдВ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реА рдзрд╛рд░рд╛ рд╣реЛрддреА рд╣реИред
  11. рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИрдбрд░ рдЖрдИрдбреА : (16) рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  12. рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИрдбрд░ рдХреА рд▓рдВрдмрд╛рдИ : (16) рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдЗрд╕ рд╣реЗрдбрд░ рдХреА рд▓рдВрдмрд╛рдИред
  13. рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИрдбрд░ : рд╢реАрд░реНрд╖рдХ рд╣реАред рд╕рдВрджрд░реНрдн рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд╛рдордЧреНрд░реА рдмрд╣реБрдд рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИред
  14. рдкреЗрд▓реЛрдб : рдкреЗрд▓реЛрдб рдбреЗрдЯрд╛ рд╣рдорд╛рд░реЗ рдмрд╣реБрдд рд╣реА рдЬреЗрдкреАрдИрдЬреА рдлреНрд░реЗрдо рд╣реИрдВред рдЦрдВрдбрд┐рдд, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗред
CSRC рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХреНрд╖реЗрддреНрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИрдВред рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ MJPEG рдХреЛ рдХреИрдорд░реЛрдВ рд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдКрдкрд░ рдПрдиреНрдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХрд╛ рдПрдХ рд╕реНрддрд░ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рддред рдЕрдм рдХрд╛рд░реНрдп рдкреНрд░рд╛рдкреНрдд рд╡реАрдбрд┐рдпреЛ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдкреВрд░реНрдг JPEG рдЫрд╡рд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рд╣реИред HTTP рдкрд░ MJPEG рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рд╣рдо рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдХрд╛рдЯрддреЗ рд╣реИрдВ рдФрд░ рддреБрд░рдВрдд JPEG рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЖрд░рдЯреАрдкреА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЫрд╡рд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЗрдкреАрдИрдЬреА рд╣реЗрдбрд░ рдХреЛ рдЫреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рд╕рдВрд▓рдЧреНрди рдЖрдВрдХрдбрд╝реЛрдВ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдмрд╣рд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

MJPEG рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХреЗ рд▓рд┐рдП RTP рдкреЗрд▓реЛрдб RFC2435 рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рднреА рджреВрдВрдЧрд╛:
+ рдмрд┐рдЯ рдСрдлрд╕реЗрдЯ0-78-1516-2324-31
0рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд┐рдЦрдВрдбрди рдСрдлрд╕реЗрдЯ
32рдЯрд╛рдЗрдкрдХреНрдпреВрдЪреМрдбрд╝рд╛рдИрдКрдВрдЪрд╛рдИ
рдЕрдЧрд░ 64..127 рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░реЗрдВрдорд╛рд░реНрдХрд░ рд╣реЗрдбрд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВ
рдпрджрд┐ 128 рдореЗрдВ рдХреНрдпреВред 25MBZрд╢реБрджреНрдзрддрд╛рд▓рдВрдмрд╛рдИ
рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рддрд╛рд▓рд┐рдХрд╛ рдбреЗрдЯрд╛

  1. рдкреНрд░рдХрд╛рд░-рд╡рд┐рд╢рд┐рд╖реНрдЯ (рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ): (8) рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЕрд░реНрде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
  2. рдлреНрд░реИрдЧрдореЗрдВрдЯ рдСрдлрд╝рд╕реЗрдЯ : (24) рд╕рдВрдкреВрд░реНрдг рдлрд╝реНрд░реЗрдо рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдлрд╝реНрд░реЗрдо рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
  3. рдкреНрд░рдХрд╛рд░ : (8) рдЫрд╡рд┐ рдХреЛ рдХреИрд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
  4. рдХреНрдпреВ (рдЧреБрдгрд╡рддреНрддрд╛): (8) рдЫрд╡рд┐ рдЧреБрдгрд╡рддреНрддрд╛ред
  5. рдЪреМрдбрд╝рд╛рдИ : (8) рдлреНрд░реЗрдо рдХреА рдЪреМрдбрд╝рд╛рдИред
  6. рдКрдВрдЪрд╛рдИ : (8) рдФрд░ рдКрдВрдЪрд╛рдИред
  7. рдорд╛рд░реНрдХрд░ рд╣реЗрдбрд░ рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░реЗрдВ : (32) RST рдорд╛рд░реНрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ JPEG рдХреЛ рдбреАрдХреЛрдб рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЙрдирдХреЗ рдХреИрдорд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рд╣реЗрдбрд░ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рдлрд╝реАрд▓реНрдб рдХреЗрд╡рд▓ рдЯрд╛рдЗрдк 64 рд╕реЗ 127 рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред
  8. рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рддрд╛рд▓рд┐рдХрд╛ рдбреЗрдЯрд╛ : рдпрджрд┐ рд╡реЗ рдореМрдЬреВрдж рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рд╕реЗ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЬреЗрдкреАрдИрдЬреА рдбреЗрдЯрд╛ рд╕реЗ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдареАрдХ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдпреЗ рдЯреЗрдмрд▓ рд╕рд╣реА рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЫрд╡рд┐ рдЧрд▓рдд рд░рдВрдЧреЛрдВ рдФрд░ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реЛрдВ рдХреЗ рд╕рд╛рде рд╣реЛрдЧреАред рдХреНрд░рдорд╢рдГ рдЪрдордХ рдФрд░ рд░рдВрдЧ рдХреЗ рд▓рд┐рдП рджреЛ рдЯреЗрдмрд▓ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП: рд▓реВрдорд╛ рдФрд░ рдХреНрд░реЛрдорд╛ред
  9. MBZ, рдкрд░рд┐рд╢реБрджреНрдзрддрд╛, рд▓рдВрдмрд╛рдИ : (32) рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВрдиреЗ рд▓рдВрдмрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рд╣реИ - 64 рдмрд╛рдЗрдЯреНрд╕ рдХреА рджреЛ - рдкреНрд░рддреНрдпреЗрдХ рддрд╛рд▓рд┐рдХрд╛ред рдЕрдиреНрдпрдерд╛, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЙрдирдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред
RST рдорд╛рд░реНрдХрд░ рд╣реЗрдбрд░ рдФрд░ рдХреНрд╡рд╛рдВрдЯрд┐рдЬрд╝реЗрд╢рди рдЯреЗрдмрд▓ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдкрд╣рд▓реЗ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ред рдпрджрд┐ рдХреЛрдИ рджреВрд╕рд░рд╛ рдирд╣реАрдВ рд╣реИ - рдкреИрд░рд╛рдореАрдЯрд░ рдХреНрдпреВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред

RTCP рдкреИрдХреЗрдЯ рдореЗрдВ рдЗрд╕рдХрд╛ рдПрдХ рдЙрдкрд╕рдореВрд╣ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: 201 - рд╕реНрд░реЛрдд рд░рд┐рдкреЛрд░реНрдЯ, 202 - рд░рд┐рд╕реАрд╡рд░ рд░рд┐рдкреЛрд░реНрдЯ, 203 - рд╕реНрд░реЛрдд рд╡рд┐рд╡рд░рдг рдФрд░ 204 - рдЧрдВрддрд╡реНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЯрд╛рдЗрдк 201 рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдлрд┐рд░ рдЯрд╛рдЗрдк рдХрд░реЗрдВ 202ред 203 рдФрд░ 204 рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрдиреНрд╣реЗрдВ рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реВрдВред рдПрдХ рдпреВрдбреАрдкреА рдкреИрдХреЗрдЯ рдореЗрдВ рдХрдИ RTCP рдкреИрдХреЗрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕рдорд╛рди рд╕рдВрд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИред рдХреЛрдИ рднреА RTCP рдкреИрдХреЗрдЯ рдирд┐рдореНрди рдбреЗрдЯрд╛ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:
+ рдмрд┐рдЯ рдСрдлрд╕реЗрдЯ0-123-78-1516-31
0рд╕рдВрд╕реНрдХрд░рдгрдЧрджреНрджреАSC рдпрд╛ RC рдпрд╛ рд╕рдмрдЯрд╛рдЗрдкрдкреИрдХреЗрдЯ рдкреНрд░рдХрд╛рд░рд▓рдВрдмрд╛рдИ

  1. рд╕рдВрд╕реНрдХрд░рдг : (2) рдЖрд░рдЯреАрдкреА рд╕рдВрд╕реНрдХрд░рдгред
  2. рдкреИрдбрд┐рдВрдЧ : (1) рдЖрд░рдЯреАрдкреА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдиред
  3. рдПрд╕рд╕реА рдпрд╛ рдЖрд░рд╕реА рдпрд╛ рд╕рдмрдЯрд╛рдЗрдк : (5) рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣ рд╕реНрд░реЛрдд (рд╕реНрд░реЛрдд рдЧрдгрдирд╛) рдпрд╛ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ (рд╕реНрд░реЛрдд рдХреА рдЧрдгрдирд╛) рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреНрд░рдорд╢рдГ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдФрд░ рд╕реНрд░реЛрдд рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрджрд┐ рдпрд╣ рдПрдХ рдПрдкреАрдкреА рдкреИрдХреЗрдЯ рд╣реИ, рддреЛ рдпрд╣ рдХреНрд╖реЗрддреНрд░ рдРрд╕реЗ рдкреИрдХреЗрдЯ рдХреЗ рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
  4. рдкреИрдХреЗрдЯ рдкреНрд░рдХрд╛рд░ : (8) рдкреИрдХреЗрдЯ рдкреНрд░рдХрд╛рд░, 201 - рд╕реНрд░реЛрдд рд░рд┐рдкреЛрд░реНрдЯ (рдкреНрд░реЗрд╖рдХ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдПрд╕рдПрд╕), 202 - рд░рд┐рд╕реАрд╡рд░ рд░рд┐рдкреЛрд░реНрдЯ (рд░рд┐рд╕реАрд╡рд░ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдЖрд░рдЖрд░), 203 - рд╕реНрд░реЛрдд рд╡рд┐рд╡рд░рдг рдПрд╕рдбреАрдИрдПрд╕ рдФрд░ 204 - рдЧрдВрддрд╡реНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рдПрдкреАрдкреА) рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  5. рд▓рдВрдмрд╛рдИ : (16) рд╣реЗрдбрд░ рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛ рдХрд╛ рдЖрдХрд╛рд░, 32 рдмрд┐рдЯ рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдЙрдиреНрд╣реЗрдВ RFC3550 рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдПрд╕рдПрд╕ рдФрд░ рдЖрд░рдЖрд░ рдкреНрд░рдХрд╛рд░ рднреЗрдЬреЗ рдЧрдП / рдкреНрд░рд╛рдкреНрдд рдкреИрдХреЗрдЯреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рд╕рдордп рдХреА рджреЗрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд▓реЗрддреЗ рд╣реИрдВред рдПрд╕рдбреАрдИрдПрд╕ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкрд╛рда рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рд╡рд╣рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реНрд░реЛрдд рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЙрд╕рдХрд╛ рдирд╛рдо, рдИрдореЗрд▓, рдлреЛрди, рд╕реНрдерд╛рди рдЖрджрд┐ред

рдЗрд╕рд╕реЗ рдкрд░рд┐рдЪрдп рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред

рдЖрд░рдЯреАрдПрд╕рдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЕрдЬрдЧрд░ рдПрдордЬреЗрдкреАрдИрдЬреА


рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдЬрдЧрд░ рдХреЗ рдкрд╛рд╕ рдЧрдПред рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рдХрдИ рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВ, main.py рдореЗрдВ рдПрдХ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рд╛рдкреНрдд рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЯреНрд╡рд┐рд╕реНрдЯреЗрдб рдиреЗрдЯрд╡рд░реНрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рддрдВрддреНрд░ рднреА рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреИрдорд░реЗ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рд╕рднреА рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ I рдХреЛ рдЫреЛрдЯрд╛, рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдВрдХ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
main.py
 20: def processImage(img): 21: 'This function is invoked by the MJPEG Client protocol' 22: # Process image 23: # Just save it as a file in this example 24: f = open('frame.jpg', 'wb') 25: f.write(img) 26: f.close() 27: 28: def main(): 29: print 'Python M-JPEG Over RSTP Client 0.1' 30: config = {'request': '/jpeg', 31: 'login': '', 32: 'password': 'admin', 33: 'ip': '192.168.0.252', 34: 'port': 554, 35: 'udp_port': 41760, 36: 'callback': processImage} 37: # Prepare RTP MJPEG client (technically it's a server) 38: reactor.listenUDP(config['udp_port'], rtp_mjpeg_client.RTP_MJPEG_Client(config)) 39: reactor.listenUDP(config['udp_port'] + 1, rtcp_client.RTCP_Client()) # RTCP 40: # And RSTP client 41: reactor.connectTCP(config['ip'], config['port'], rtsp_client.RTSPFactory(config)) 42: # Run both of them 43: reactor.run() 44: # On exit: 45: print 'Python M-JPEG Client stopped.' 

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк RTCP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдП рдмрд┐рдирд╛ рдФрд░ рдСрдбрд┐рдпреЛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреИрдорд░рд╛ рд▓рдЧрднрдЧ рдПрдХ рдорд┐рдирдЯ рдХреЗ рдмрд╛рдж рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдореЗрдВ рд╣рд░ рд╕рдордп рдкреБрди: рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ RTCP рднрд╛рдЧ рдХреЛ рдЬреЛрдбрд╝рд╛ рдФрд░ рдСрдбрд┐рдпреЛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдХреНрдд рдмрдирд╛рдпрд╛ред

рдЕрдЧрд▓реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдлрд╝рд╛рдЗрд▓ rtsp_client.py ред рд╡рд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рднреНрд░рдорд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕рдХрд╛ рд▓рдХреНрд╖реНрдп рд╕реНрдкрд╖реНрдЯ рд╣реИ - рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ред
rtsp_client.py
 012: class RTSPClient(Protocol): 013: def __init__(self): 014: self.config = {} 015: self.wait_description = False 016: 017: def connectionMade(self): 018: self.session = 1 019: # Authorization part 020: if self.config['login']: 021: authstring = 'Authorization: Basic ' + b64encode(self.config['login']+':'+self.config['password']) + '\r\n' 022: else: 023: authstring = '' 024: # send OPTIONS request 025: to_send = """\ 026: OPTIONS rtsp://""" + self.config['ip'] + self.config['request'] + """ RTSP/1.0\r 027: """ + authstring + """CSeq: 1\r 028: User-Agent: Python MJPEG Client\r 029: \r 030: """ 031: self.transport.write(to_send) 032: if debug: 033: print 'We say:\n', to_send 034: 035: def dataReceived(self, data): 036: if debug: 037: print 'Server said:\n', data 038: # Unify input data 039: data_ln = data.lower().strip().split('\r\n', 5) 040: # Next behaviour is relevant to CSeq 041: # which defines current conversation state 042: if data_ln[0] == 'rtsp/1.0 200 ok' or self.wait_description: 043: # There might be an audio stream 044: if 'audio_track' in self.config: 045: cseq_audio = 1 046: else: 047: cseq_audio = 0 048: to_send = '' 049: if 'cseq: 1' in data_ln: 050: # CSeq 1 -> DESCRIBE 051: to_send = """\ 052: DESCRIBE rtsp://""" + self.config['ip'] + self.config['request'] + """ RTSP/1.0\r 053: CSeq: 2\r 054: Accept: application/sdp\r 055: User-Agent: Python MJPEG Client\r 056: \r 057: """ 058: elif 'cseq: 2' in data_ln or self.wait_description: 059: # CSeq 2 -> Parse SDP and then SETUP 060: data_sp = data.lower().strip().split('\r\n\r\n', 1) 061: # wait_description is used when SDP is sent in another UDP 062: # packet 063: if len(data_sp) == 2 or self.wait_description: 064: # SDP parsing 065: video = audio = False 066: is_MJPEG = False 067: video_track = '' 068: audio_track = '' 069: if len(data_sp) == 2: 070: s = data_sp[1].lower() 071: elif self.wait_description: 072: s = data.lower() 073: for line in s.strip().split('\r\n'): 074: if line.startswith('m=video'): 075: video = True 076: audio = False 077: if line.endswith('26'): 078: is_MJPEG = True 079: if line.startswith('m=audio'): 080: video = False 081: audio = True 082: self.config['udp_port_audio'] = int(line.split(' ')[1]) 083: if video: 084: params = line.split(':', 1) 085: if params[0] == 'a=control': 086: video_track = params[1] 087: if audio: 088: params = line.split(':', 1) 089: if params[0] == 'a=control': 090: audio_track = params[1] 091: if not is_MJPEG: 092: print "Stream", self.config['ip'] + self.config['request'], 'is not an MJPEG stream!' 093: if video_track: self.config['video_track'] = 'rtsp://' + self.config['ip'] + self.config['request'] + '/' + basename(video_track) 094: if audio_track: self.config['audio_track'] = 'rtsp://' + self.config['ip'] + self.config['request'] + '/' + basename(audio_track) 095: to_send = """\ 096: SETUP """ + self.config['video_track'] + """ RTSP/1.0\r 097: CSeq: 3\r 098: Transport: RTP/AVP;unicast;client_port=""" + str(self.config['udp_port']) + """-"""+ str(self.config['udp_port'] + 1) + """\r 099: User-Agent: Python MJPEG Client\r 100: \r 101: """ 102: self.wait_description = False 103: else: 104: # Do not have SDP in the first UDP packet, wait for it 105: self.wait_description = True 106: elif "cseq: 3" in data_ln and 'audio_track' in self.config: 107: # CSeq 3 -> SETUP audio if present 108: self.session = data_ln[5].strip().split(' ')[1] 109: to_send = """\ 110: SETUP """ + self.config['audio_track'] + """ RTSP/1.0\r 111: CSeq: 4\r 112: Transport: RTP/AVP;unicast;client_port=""" + str(self.config['udp_port_audio']) + """-"""+ str(self.config['udp_port_audio'] + 1) + """\r 113: Session: """ + self.session + """\r 114: User-Agent: Python MJPEG Client\r 115: \r 116: """ 117: reactor.listenUDP(self.config['udp_port_audio'], rtp_audio_client.RTP_AUDIO_Client(self.config)) 118: reactor.listenUDP(self.config['udp_port_audio'] + 1, rtcp_client.RTCP_Client()) # RTCP 119: elif "cseq: "+str(3+cseq_audio) in data_ln: 120: # PLAY 121: to_send = """\ 122: PLAY rtsp://""" + self.config['ip'] + self.config['request'] + """/ RTSP/1.0\r 123: CSeq: """ + str(4+cseq_audio) + """\r 124: Session: """ + self.session + """\r 125: Range: npt=0.000-\r 126: User-Agent: Python MJPEG Client\r 127: \r 128: """ 129: elif "cseq: "+str(4+cseq_audio) in data_ln: 130: if debug: 131: print 'PLAY' 132: pass 133: 134: elif "cseq: "+str(5+cseq_audio) in data_ln: 135: if debug: 136: print 'TEARDOWN' 137: pass 138: 139: if to_send: 140: self.transport.write(to_send) 141: if debug: 142: print 'We say:\n', to_send 

рдПрдХ рдСрдбрд┐рдпреЛ рдЯреНрд░реИрдХ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рдореЙрдбреНрдпреВрд▓ rtp_audio_client.py рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд RTCP рдХреНрд▓рд╛рдЗрдВрдЯ рднреА рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИред

рдПрдХ рд╕рдлрд▓ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдмрд╛рдж, rtp_mjpeg_client.py рдХрд╛рдо рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдиреЗ рд╡рд╛рд▓реА рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
rtp_mjpeg_client.py
 08: class RTP_MJPEG_Client(DatagramProtocol): 09: def __init__(self, config): 10: self.config = config 11: # Previous fragment sequence number 12: self.prevSeq = -1 13: self.lost_packet = 0 14: # Object that deals with JPEGs 15: self.jpeg = rfc2435jpeg.RFC2435JPEG() 16: 17: def datagramReceived(self, datagram, address): 18: # When we get a datagram, parse it 19: rtp_dg = rtp_datagram.RTPDatagram() 20: rtp_dg.Datagram = datagram 21: rtp_dg.parse() 22: # Check for lost packets 23: if self.prevSeq != -1: 24: if (rtp_dg.SequenceNumber != self.prevSeq + 1) and rtp_dg.SequenceNumber != 0: 25: self.lost_packet = 1 26: self.prevSeq = rtp_dg.SequenceNumber 27: # Handle Payload 28: if rtp_dg.PayloadType == 26: # JPEG compressed video 29: self.jpeg.Datagram = rtp_dg.Payload 30: self.jpeg.parse() 31: # Marker = 1 if we just received the last fragment 32: if rtp_dg.Marker: 33: if not self.lost_packet: 34: # Obtain complete JPEG image and give it to the 35: # callback function 36: self.jpeg.makeJpeg() 37: self.config['callback'](self.jpeg.JpegImage) 38: else: 39: #print "RTP packet lost" 40: self.lost_packet = 0 41: self.jpeg.JpegPayload = "" 

рдЙрд╕реЗ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИред рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдПрдХ рдФрд░ рдбреЗрдЯрд╛рдЧреНрд░рд╛рдо рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЗрд╕реЗ rtp_datagram.py рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ rfc2435jpeg.py рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдлреАрдб рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдкреВрд░реНрдг JPEG рдЫрд╡рд┐ рдмрдирд╛рддрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рд╣рдо rtp_dg.Marker рдорд╛рд░реНрдХрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред

RTP рдбреЗрдЯрд╛рдЧреНрд░рд╛рдо рдкрд╛рд░реНрд╕рд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
rtp_datagram.py
 26: def parse(self): 27: Ver_P_X_CC, M_PT, self.SequenceNumber, self.Timestamp, self.SyncSourceIdentifier = unpack('!BBHII', self.Datagram[:12]) 28: self.Version = (Ver_P_X_CC & 0b11000000) >> 6 29: self.Padding = (Ver_P_X_CC & 0b00100000) >> 5 30: self.Extension = (Ver_P_X_CC & 0b00010000) >> 4 31: self.CSRCCount = Ver_P_X_CC & 0b00001111 32: self.Marker = (M_PT & 0b10000000) >> 7 33: self.PayloadType = M_PT & 0b01111111 34: i = 0 35: for i in range(0, self.CSRCCount, 4): 36: self.CSRS.append(unpack('!I', self.Datagram[12+i:16+i])) 37: if self.Extension: 38: i = self.CSRCCount * 4 39: (self.ExtensionHeaderID, self.ExtensionHeaderLength) = unpack('!HH', self.Datagram[12+i:16+i]) 40: self.ExtensionHeader = self.Datagram[16+i:16+i+self.ExtensionHeaderLength] 41: i += 4 + self.ExtensionHeaderLength 42: self.Payload = self.Datagram[12+i:] 

JPEG рд░рд┐рдХрд╡рд░реА рдореЙрдбреНрдпреВрд▓ рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХрдИ рдЯреЗрдмрд▓ рдФрд░ рдПрдХ рд▓рдВрдмреЗ рд╣реЗрдбрд░ рдЬрдирд░реЗрд╢рди рдлрдВрдХреНрд╢рди рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдпрд╣рд╛рдВ рдЫреЛрдбрд╝ рджреВрдБрдЧрд╛, рдХреЗрд╡рд▓ рдЖрд░рдЯреАрдкреА рдкреЗрд▓реЛрдб рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдФрд░ рдЕрдВрддрд┐рдо рдЬреЗрдкреАрдИрдЬреА рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред
rfc2435jpeg.py
 287: def parse(self): 288: HOffset = 0 289: LOffset = 0 290: # Straightforward parsing 291: (self.TypeSpecific, 292: HOffset, #3 byte offset 293: LOffset, 294: self.Type, 295: self.Q, 296: self.Width, 297: self.Height) = unpack('!BBHBBBB', self.Datagram[:8]) 298: self.Offest = (HOffset << 16) + LOffset 299: self.Width = self.Width << 3 300: self.Height = self.Height << 3 301: 302: # Check if we have Restart Marker header 303: if 64 <= self.Type <= 127: 304: # TODO: make use of that header 305: self.RM_Header = self.Datagram[8:12] 306: rm_i = 4 # Make offset for JPEG Header 307: else: 308: rm_i = 0 309: 310: # Check if we have Quantinization Tables embedded into JPEG Header 311: # Only the first fragment will have it 312: if self.Q > 127 and not self.JpegPayload: 313: self.JpegPayload = self.Datagram[rm_i+8+132:] 314: QT_Header = self.Datagram[rm_i+8:rm_i+140] 315: (self.QT_MBZ, 316: self.QT_Precision, 317: self.QT_Length) = unpack('!BBH', QT_Header[:4]) 318: self.QT_luma = string2list(QT_Header[4:68]) 319: self.QT_chroma = string2list(QT_Header[68:132]) 320: else: 321: self.JpegPayload += self.Datagram[rm_i+8:] 322: # Clear tables. Q might be dynamic. 323: if self.Q <= 127: 324: self.QT_luma = [] 325: self.QT_chroma = [] 326: 327: def makeJpeg(self): 328: lqt = [] 329: cqt = [] 330: dri = 0 331: # Use exsisting tables or generate ours 332: if self.QT_luma: 333: lqt=self.QT_luma 334: cqt=self.QT_chroma 335: else: 336: MakeTables(self.Q,lqt,cqt) 337: JPEGHdr = [] 338: # Make a complete JPEG header 339: MakeHeaders(JPEGHdr, self.Type, int(self.Width), int(self.Height), lqt, cqt, dri) 340: self.JpegHeader = list2string(JPEGHdr) 341: # And a complete JPEG image 342: self.JpegImage = self.JpegHeader + self.JpegPayload 343: self.JpegPayload = '' 344: self.JpegHeader = '' 345: self.Datagram = '' 

рдореИрдВрдиреЗ rtp_audio_client.py рдСрдбрд┐рдпреЛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдЦреЗрд▓рдиреЗ рдпреЛрдЧреНрдп рдбреЗрдЯрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рддреЛ рдореИрдВрдиреЗ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рд╕реНрдХреЗрдЪ рдмрдирд╛рдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЗрд╡рд▓ rfc2435jpeg.py рд╕рдорд╛рди рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдСрдбрд┐рдпреЛ рдбреЗрдЯрд╛ рдЖрд╕рд╛рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЦрдВрдбрд┐рдд рдирд╣реАрдВ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкреИрдХреЗрдЬ рдкреНрд░рдЬрдирди рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдбреЗрдЯрд╛ рд╡рд╣рди рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдпрд╣рд╛рдВ рдирд╣реАрдВ рд▓рд╛рдКрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд▓реЗрдЦ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реИ (рдореИрдВрдиреЗ рдЬрд▓реНрдж рд╣реА рдПрдХ рд╣реИрдмрд░рдлреЛрд▓реНрдб рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛)ред

рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ RTCP рдкреИрдХреЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдкреНрд░реЗрд╖рдХ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ, рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рднреЗрдЬреЗрдВред рдХрд╛рд░реНрдп рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреИрдорд░реЗ рд╕реЗ рдПрд╕рдЖрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЕрдкрдирд╛ рдЖрд░рдЖрд░ рднреЗрдЬреЗрдВрдЧреЗ рдФрд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЖрджрд░реНрд╢рд┐рдд рдбреЗрдЯрд╛ рдореЗрдВ рд░рдЦреЗрдВрдЧреЗ рдХрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред
rtcp_client.py
 09: class RTCP_Client(DatagramProtocol): 10: def __init__(self): 11: # Object that deals with RTCP datagrams 12: self.rtcp = rtcp_datagram.RTCPDatagram() 13: def datagramReceived(self, datagram, address): 14: # SSRC Report received 15: self.rtcp.Datagram = datagram 16: self.rtcp.parse() 17: # Send back our Receiver Report 18: # saying that everything is fine 19: RR = self.rtcp.generateRR() 20: self.transport.write(RR, address) 

рд▓реЗрдХрд┐рди рдореЙрдбреНрдпреВрд▓ рд╕реАрдзреЗ RTCP рдбреЗрдЯрд╛рдЧреНрд░рд╛рдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рднреА рдХрд╛рдлреА рдмрдбрд╝рд╛ рдирд┐рдХрд▓рд╛ред
rtcp_datagram.py
 049: def parse(self): 050: # RTCP parsing is complete 051: # including SDES, BYE and APP 052: # RTCP Header 053: (Ver_P_RC, 054: PacketType, 055: Length) = unpack('!BBH', self.Datagram[:4]) 056: Version = (Ver_P_RC & 0b11000000) >> 6 057: Padding = (Ver_P_RC & 0b00100000) >> 5 058: # Byte offset 059: off = 4 060: # Sender's Report 061: if PacketType == 200: 062: # Sender's information 063: (self.SSRC_sender, 064: self.NTP_TimestampH, 065: self.NTP_TimestampL, 066: self.RTP_Timestamp, 067: self.SenderPacketCount, 068: self.SenderOctetCount) = unpack('!IIIIII', self.Datagram[off: off + 24]) 069: off += 24 070: ReceptionCount = Ver_P_RC & 0b00011111 071: if debug: 072: print 'SDES: SR from', str(self.SSRC_sender) 073: # Included Receiver Reports 074: self.Reports = [] 075: i = 0 076: for i in range(ReceptionCount): 077: self.Reports.append(Report()) 078: self.Reports[i].SSRC, 079: self.Reports[i].FractionLost, 080: self.Reports[i].CumulativeNumberOfPacketsLostH, 081: self.Reports[i].CumulativeNumberOfPacketsLostL, 082: self.Reports[i].ExtendedHighestSequenceNumberReceived, 083: self.Reports[i].InterarrivalJitter, 084: self.Reports[i].LastSR, 085: self.Reports[i].DelaySinceLastSR = unpack('!IBBHIIII', self.Datagram[off: off + 24]) 086: off += 24 087: # Source Description (SDES) 088: elif PacketType == 202: 089: # RC now is SC 090: SSRCCount = Ver_P_RC & 0b00011111 091: self.SourceDescriptions = [] 092: i = 0 093: for i in range(SSRCCount): 094: self.SourceDescriptions.append(SDES()) 095: SSRC, = unpack('!I', self.Datagram[off: off + 4]) 096: off += 4 097: self.SourceDescriptions[i].SSRC = SSRC 098: SDES_Item = -1 099: # Go on the list of descriptions 100: while SDES_Item != 0: 101: SDES_Item, = unpack('!B', self.Datagram[off]) 102: off += 1 103: if SDES_Item != 0: 104: SDES_Length, = unpack('!B', self.Datagram[off]) 105: off += 1 106: Value = self.Datagram[off: off + SDES_Length] 107: off += SDES_Length 108: if debug: 109: print 'SDES:', SDES_Item, Value 110: if SDES_Item == 1: 111: self.SourceDescriptions[i].CNAME = Value 112: elif SDES_Item == 2: 113: self.SourceDescriptions[i].NAME = Value 114: elif SDES_Item == 3: 115: self.SourceDescriptions[i].EMAIL = Value 116: elif SDES_Item == 4: 117: self.SourceDescriptions[i].PHONE = Value 118: elif SDES_Item == 5: 119: self.SourceDescriptions[i].LOC = Value 120: elif SDES_Item == 6: 121: self.SourceDescriptions[i].TOOL = Value 122: elif SDES_Item == 7: 123: self.SourceDescriptions[i].NOTE = Value 124: elif SDES_Item == 8: 125: self.SourceDescriptions[i].PRIV = Value 126: # Extra parsing for PRIV is needed 127: elif SDES_Item == 0: 128: # End of list. Padding to 32 bits 129: while (off % 4): 130: off += 1 131: # BYE Packet 132: elif PacketType == 203: 133: SSRCCount = Ver_P_RC & 0b00011111 134: i = 0 135: for i in range(SSRCCount): 136: SSRC, = unpack('!I', self.Datagram[off: off + 4]) 137: off += 4 138: print 'SDES: SSRC ' + str(SSRC) + ' is saying goodbye.' 139: # Application specific packet 140: elif PacketType == 204: 141: Subtype = Ver_P_RC & 0b00011111 142: SSRC, = unpack('!I', self.Datagram[off: off + 4]) 143: Name = self.Datagram[off + 4: off + 8] 144: AppData = self.Datagram[off + 8: off + Length] 145: print 'SDES: APP Packet "' + Name + '" from SSRC ' + str(SSRC) + '.' 146: off += Length 147: # Check if there is something else in the datagram 148: if self.Datagram[off:]: 149: self.Datagram = self.Datagram[off:] 150: self.parse() 151: 152: def generateRR(self): 153: # Ver 2, Pad 0, RC 1 154: Ver_P_RC = 0b10000001 155: # PT 201, Length 7, SSRC 0xF00F - let it be our ID 156: Header = pack('!BBHI', Ver_P_RC, 201, 7, 0x0000F00F) 157: NTP_32 = (self.NTP_TimestampH & 0x0000FFFF) + ((self.NTP_TimestampL & 0xFFFF0000) >> 16) 158: # No lost packets, no delay in receiving data, RR sent right after receiving SR 159: # Instead of self.SenderPacketCount should be proper value 160: ReceiverReport = pack('!IBBHIIII', self.SSRC_sender, 0, 0, 0, self.SenderPacketCount, 1, NTP_32, 1) 161: return Header + ReceiverReport 

рдЖрд░рдПрдлрд╕реА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╕рдЦреНрддреА рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рдореИрдВ unpackрдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЪрд░ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рдЙрд╕ рдбреЗрдЯрд╛ рд╕рд░рдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ offрдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдСрдлрд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред

рдФрд░ рдпрд╣рд╛рдБ рд▓рд┐рдВрдХ рд╣реИ: рдЖрд░рдЯреАрдПрд╕рдкреА рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЕрдЬрдЧрд░ рдПрдордЬреЗрдкреАрдИрдЬреА ред

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

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

  1. рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдорд▓реНрдЯреАрдореАрдбрд┐рдпрд╛
  2. рдСрдбрд┐рдпреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП RTP рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХреА рд╕реВрдЪреА
рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдФрд░ рдЬрд┐рд╕рдиреЗ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХреА - рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛!

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


All Articles