рдмреНрд░рд╛рдЙрдЭрд░рд╡рд░реВрди (рдЬрд╡рд│рдЬрд╡рд│) рдирд┐рд░реБрдкрдпреЛрдЧреА рд╡реЗрдмрдХреЕрдо рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ. рднрд╛рдЧ 2. WebRTC

рдХрд╕рд╛ рддрд░реА рдЖрдд ╨╛╨┤╨╜╨╛╨╣ рдЬреБрдиреНрдпрд╛ рдЖрдгрд┐ рдЖрдзреАрдЪ рд╕реЛрдбреВрди рджрд┐рд▓реЗрд▓реНрдпрд╛ рд▓реЗрдЦрд╛рдВрдордзреВрди, рдореА рд╡реЗрдмрд╕реЙрдХреЗрдЯрджреНрд╡рд╛рд░реЗ рдХреЕрдирд╡реНрд╣рд╛рд╕рд╡рд░реВрди рд╡реНрд╣рд┐рдбрд┐рдУ рдХрд┐рддреА рд╕рд╣рдЬ рдЖрдгрд┐ рдиреИрд╕рд░реНрдЧрд┐рдХрд░рд┐рддреНрдпрд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░реВ рд╢рдХрддрд╛ рдпрд╛рдмрджреНрджрд▓ рд▓рд┐рд╣рд┐рд▓реЗ. рддреНрдпрд╛ рд▓реЗрдЦрд╛рдд, рдореА рдХреЕрдореЗрд▒реНрдпрд╛рддреВрди рд╡реНрд╣рд┐рдбрд┐рдУ рдХрд╕рд╛ рдШреНрдпрд╛рдпрдЪрд╛ рдЖрдгрд┐ рдорд╛рдпрдХреНрд░реЛрдлреЛрди рд╡рд╛рдкрд░реВрди рдЖрд╡рд╛рдЬ рдХрд╕рд╛ рдШреНрдпрд╛рдпрдЪрд╛ рдпрд╛рдмрджреНрджрд▓ рдереЛрдбрдХреНрдпрд╛рдд рдмреЛрд▓рд▓реЛ MediaStream API, рдкреНрд░рд╛рдкреНрдд рдЭрд╛рд▓реЗрд▓рд╛ рдкреНрд░рд╡рд╛рд╣ рдПрдиреНрдХреЛрдб рдХрд╕рд╛ рдХрд░рд╛рдпрдЪрд╛ рдЖрдгрд┐ рд╡реЗрдмрд╕реЙрдХреЗрдЯрджреНрд╡рд╛рд░реЗ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдХрд╕рд╛ рдкрд╛рдард╡рд╛рдпрдЪрд╛. рддрдерд╛рдкрд┐, рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рддреЗ рдЕрд╕реЗ рдХрд░рдд рдирд╛рд╣реАрдд, рдкреНрд░рд╕рд╛рд░рдгрд╛рд╕рд╛рдареА рддреЗ рдПрдХрддрд░ рд╡рд┐рд╢реЗрд╖ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рд╡рд╛рдкрд░рддрд╛рдд рдЬреЗ рд╕реНрдерд╛рдкрд┐рдд рдЖрдгрд┐ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ: рдСрдлрд╣рдБрдб, рд╣реЗ рдЕрд╕реВ рд╢рдХрддреЗ рдУрдкрди рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░, рдХрд┐рдВрд╡рд╛ рддреЗ WebRTC рд╡рд╛рдкрд░рддрд╛рдд, рдЬреЗ рдЕрдЧрджреА рдмреЙрдХреНрд╕рдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рдХрд╛рд░реНрдп рдХрд░рддреЗ, рдореНрд╣рдгрдЬреЗрдЪ, рд▓рд╛ рдлреНрд▓реЕрд╢ рдкреНрд▓реЗрдпрд░ рдЕрд╕реЗ рдХреЛрдгрддреЗрд╣реА рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА, рдЬреЗ рдбрд┐рд╕реЗрдВрдмрд░рдордзреНрдпреЗ рдЖрдзреАрдЪ Chromium рдмреНрд░рд╛рдЙрдЭрд░рдордзреВрди рдХрд╛рдкрд▓реЗ рдЬрд╛рдИрд▓.

рдЖрдЬ рдЖрдкрдг WebRTC рдмрджреНрджрд▓ рдмреЛрд▓реВ.

рд╡реЗрдм рд░реАрдЕрд▓-рдЯрд╛рдЗрдо рдХрдореНрдпреБрдирд┐рдХреЗрд╢рди (рд╡реЗрдмрдЖрд░рдЯреАрд╕реА) рд╣рд╛ рдПрдХрдЪ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдирд╛рд╣реА, рддреЛ рдорд╛рдирдХ, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЖрдгрд┐ JavaScript API рдЪрд╛ рд╕рдВрдкреВрд░реНрдг рд╕рдВрдЧреНрд░рд╣ рдЖрд╣реЗ рдЬреЛ рдПрдХрддреНрд░рд┐рддрдкрдгреЗ рдкреАрдЕрд░-рдЯреВ-рдкреАрдЕрд░ рд░реАрдЕрд▓-рдЯрд╛рдЗрдо рд╡реНрд╣рд┐рдбрд┐рдУ-рдСрдбрд┐рдУ рдХрдореНрдпреБрдирд┐рдХреЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддреЛ рдЖрдгрд┐ рдХреЛрдгрддреНрдпрд╛рд╣реА рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рджреЗрдЦреАрд▓ рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ. рдмрд╛рдпрдирд░реА рдбреЗрдЯрд╛. рд╕рд╣рд╕рд╛ рдмреНрд░рд╛рдЙрдЭрд░ рд╕рдорд╡рдпрд╕реНрдХ рдореНрд╣рдгреВрди рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд, рдкрд░рдВрддреБ рддреЗ рдореЛрдмрд╛рдЗрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рджреЗрдЦреАрд▓ рдЕрд╕реВ рд╢рдХрддрд╛рдд, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде. рдХреНрд▓рд╛рдпрдВрдЯ рджрд░рдореНрдпрд╛рди p2p рд╕рдВрдкреНрд░реЗрд╖рдг рдЖрдпреЛрдЬрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рд╡рд┐рд╡рд┐рдз рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рд╡реНрд╣рд┐рдбрд┐рдУ рдЖрдгрд┐ рдСрдбрд┐рдУ рдПрдиреНрдХреЛрдбрд┐рдВрдЧрд╕рд╛рдареА рдмреНрд░рд╛рдЙрдЭрд░ рд╕рдорд░реНрдерди рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рд╡рд┐рд╡рд┐рдз рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓рд╕рд╛рдареА рд╕рдорд░реНрдерди, рдмреНрд░рд╛рдЙрдЭрд░рд╕рд╣ рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░рдЪреА рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рдж рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдгреЗ (OS рд╕реНрддрд░рд╛рдВрджреНрд╡рд╛рд░реЗ): рд╡реЗрдмрдХреЕрдо, рд╕рд╛рдЙрдВрдб рдХрд╛рд░реНрдбреНрд╕. рд╡рд┐рдХрд╛рд╕рдХрд╛рдЪреНрдпрд╛ рд╕реЛрдпреАрд╕рд╛рдареА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдкреАрдЖрдп рдЕтАНреЕрдмрд╕реНрдЯреНрд░реЕрдХреНрд╢рдирдЪреНрдпрд╛ рдорд╛рдЧреЗ рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рдЪрд╛ рд╣рд╛ рд╕рдЧрд│рд╛ рд╣реЙрдЬрдкреЙрдЬ рд▓рдкрд▓реЗрд▓рд╛ рдЖрд╣реЗ.

рд╣реЗ рд╕рд░реНрд╡ рддреАрди API рд╡рд░ рдЙрдХрд│рддреЗ:

  • MediaStream API тАФ рдЧреЗрд▓реНрдпрд╛ рд╡реЗрд│реА рдЙрдзреНрд╡рд╕реНрдд, рдЖрдЬ рдореА рддреНрдпрд╛рдЪреНрдпрд╛рдмрджреНрджрд▓ рдереЛрдбреЗ рдЕрдзрд┐рдХ рд▓рд┐рд╣реАрди. рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░рдордзреВрди рд╡реНрд╣рд┐рдбрд┐рдУ / рдСрдбрд┐рдУ рдкреНрд░рд╡рд╛рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕реЗрд╡рд╛ рджреЗрддреЗ

  • RTCPeerConnection - рджреЛрди рдХреНрд▓рд╛рдпрдВрдЯ (p2p) рджрд░рдореНрдпрд╛рди рд╕рдВрд╡рд╛рдж рдкреНрд░рджрд╛рди рдХрд░рддреЗ

  • RTCDataChannel - рджреЛрди рдХреНрд▓рд╛рдпрдВрдЯ рджрд░рдореНрдпрд╛рди рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдбреЗрдЯрд╛ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд░реНрдп рдХрд░рддреЗ

рдкреНрд░рд╕рд╛рд░рдгрд╛рд╕рд╛рдареА рдСрдбрд┐рдУ рдЖрдгрд┐ рд╡реНрд╣рд┐рдбрд┐рдУ рдкреНрд░рд╡рд╛рд╣ рддрдпрд╛рд░ рдХрд░рдд рдЖрд╣реЗ

рд╣реЗ рд╕рд░реНрд╡ рд╡реЗрдмрдХреЕрдо рдЖрдгрд┐ рдорд╛рдпрдХреНрд░реЛрдлреЛрди рдореАрдбрд┐рдпрд╛ рдкреНрд░рд╡рд╛рд╣ "рдХреЕрдкреНрдЪрд░" рдиреЗ рд╕реБрд░реВ рд╣реЛрддреЗ. рдЕрд░реНрдерд╛рдд, рдЯреЗрд▓рд┐рдХреЙрдиреНрдлрд░рдиреНрд╕ рдЖрдпреЛрдЬрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрдЪреНрдЪреЗ рдкреНрд░рд╡рд╛рд╣ рдпреЛрдЧреНрдп рдирд╛рд╣реАрдд, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╡рд╛рд╣рд╛рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ: рдЧреБрдгрд╡рддреНрддрд╛ рд╕реБрдзрд╛рд░рдгреЗ, рд╡реНрд╣рд┐рдбрд┐рдУрд╕рд╣ рдСрдбрд┐рдУ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЭ рдХрд░рдгреЗ, рд╡реНрд╣рд┐рдбрд┐рдУ рдкреНрд░рд╡рд╛рд╣рд╛рдд рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЭреЗрд╢рди рдЧреБрдг рдареЗрд╡рд╛ рдЖрдгрд┐ рдЪреЕрдиреЗрд▓рдЪреНрдпрд╛ рд╕рддрдд рдмрджрд▓рдгрд╛рд▒реНрдпрд╛ рдмрдБрдбрд╡рд┐рдбреНрдерд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдмрд┐рдЯрд░реЗрдЯ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рд╛. . рдмреНрд░рд╛рдЙрдЭрд░ рдпрд╛ рд╕рд░реНрд╡ рдЧреЛрд╖реНрдЯреАрдВрдЪреА рдХрд╛рд│рдЬреА рдШреЗрддреЛ, рд╡рд┐рдХрд╕рдХрд╛рд▓рд╛ рдореАрдбрд┐рдпрд╛ рдкреНрд░рд╡рд╛рд╣рд╛рдВрд╕рд╛рдареА рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рдмрджреНрджрд▓ рдХрд╛рд│рдЬреА рдХрд░рдгреНрдпрд╛рдЪреА рджреЗрдЦреАрд▓ рдЧрд░рдЬ рдирд╛рд╣реА. рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЭрд░рдордзреНрдпреЗ, рдХреЕрдкреНрдЪрд░рд┐рдВрдЧ, рдЧреБрдгрд╡рддреНрддрд╛ рд╕реБрдзрд╛рд░рдгреНрдпрд╛рд╕рд╛рдареА (рдзреНрд╡рдиреАрдордзреВрди рдкреНрд░рддрд┐рдзреНрд╡рдиреА рдЖрдгрд┐ рдЖрд╡рд╛рдЬ рдХрд╛рдврд╛, рдЪрд┐рддреНрд░ рд╕реБрдзрд╛рд░рд╛), рд╡реНрд╣рд┐рдбрд┐рдУ рдЖрдгрд┐ рдСрдбрд┐рдУ рдПрдиреНрдХреЛрдбрд┐рдВрдЧрд╕рд╛рдареА рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рд╕реНрддрд░ рдЖрдзреАрдкрд╛рд╕реВрдирдЪ рдЖрд╣реЗрдд. рд╕реНрддрд░ рдпреЛрдЬрдирд╛ рдЕрдВрдЬреАрд░ рдордзреНрдпреЗ рджрд░реНрд╢рд╡рд┐рд▓реА рдЖрд╣реЗ. рез:

рдмреНрд░рд╛рдЙрдЭрд░рд╡рд░реВрди (рдЬрд╡рд│рдЬрд╡рд│) рдирд┐рд░реБрдкрдпреЛрдЧреА рд╡реЗрдмрдХреЕрдо рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ. рднрд╛рдЧ 2. WebRTCрддрд╛рдВрджреВрд│. 1. рдмреНрд░рд╛рдЙрдЭрд░рдордзреНрдпреЗ рдСрдбрд┐рдУ рдЖрдгрд┐ рд╡реНрд╣рд┐рдбрд┐рдУ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреЗ рд╕реНрддрд░

рд╕рд░реНрд╡ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдереЗрдЯ рдмреНрд░рд╛рдЙрдЭрд░рдордзреНрдпреЗрдЪ рд╣реЛрддрд╛рдд, рдХреЛрдгрддреЗрд╣реА рдЕрддрд┐рд░рд┐рдХреНрдд рдирд╛рд╣реА. рдХреЛрдгрддреЗрд╣реА рдкреНрд▓рдЧрдЗрди рдЖрд╡рд╢реНрдпрдХ рдирд╛рд╣реА. рддрдерд╛рдкрд┐, 2020 рд╕рд╛рдареА рдЧреЛрд╖реНрдЯреА рдЕрджреНрдпрд╛рдк рддрд┐рддрдХреНрдпрд╛ рдЧреБрд▓рд╛рдмреА рдирд╛рд╣реАрдд. рдЕрд╕реЗ рдмреНрд░рд╛рдЙрдЭрд░ рдЖрд╣реЗрдд рдЬреЗ рдЕрджреНрдпрд╛рдк рдкреВрд░реНрдгрдкрдгреЗ рд╕рдорд░реНрдерди рджреЗрдд рдирд╛рд╣реАрдд MediaStream API, рддреБрдореНрд╣реА рджреБрд╡реНрдпрд╛рдЪреЗ рдЕрдиреБрд╕рд░рдг рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рдЕрдЧрджреА рддрд│рд╛рд╢реА рд╕реБрд╕рдВрдЧрддрддрд╛ рд╕рд╛рд░рдгреА рдкрд╛рд╣реВ рд╢рдХрддрд╛. рд╡рд┐рд╢реЗрд╖рддрдГ IE рдкреБрдиреНрд╣рд╛ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рдЖрд╣реЗ.

рдкреНрд░рд╛рдкреНрдд рдЭрд╛рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рд╡рд╛рд╣рд╛рдВрд╕рд╣ рддреБрдореНрд╣реА рдЦреВрдк рдордиреЛрд░рдВрдЬрдХ рдЧреЛрд╖реНрдЯреА рдХрд░реВ рд╢рдХрддрд╛: рддреБрдореНрд╣реА рдХреНрд▓реЛрди рдХрд░реВ рд╢рдХрддрд╛, рд╡реНрд╣рд┐рдбрд┐рдУ рд░рд┐рдЭреЛрд▓реНрдпреВрд╢рди рдмрджрд▓реВ рд╢рдХрддрд╛, рдСрдбрд┐рдУ рдЧреБрдгрд╡рддреНрддреЗрдд рдлреЗрд░рдлрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛, рддреБрдореНрд╣реА рдореАрдбрд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдо рд╕реНрдЯреНрд░реАрдо рдШреЗрдК рд╢рдХрддрд╛ рдЖрдгрд┐ "рд╣реБрдХ" рдХрд░реВ рд╢рдХрддрд╛ html рдкреГрд╖реНрдард╛рд╡рд░ рд╕реНрд╡рддрдГрд▓рд╛ рдЯреЕрдЧ рдХрд░рд╛ рдЖрдгрд┐ рдкрд╣рд╛. рдХрд┐рдВрд╡рд╛ рддреБрдореНрд╣реА рдХреЕрдирд╡реНрд╣рд╛рд╕рд╡рд░ рдПрдХ рдкреНрд░рд╡рд╛рд╣ рдХрд╛рдвреВ рд╢рдХрддрд╛ рдЖрдгрд┐ WebGL рдХрд┐рдВрд╡рд╛ CSS3 рд╕реЗрдЯ рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рд╡реНрд╣рд┐рдбрд┐рдУрд╡рд░ рд╡рд┐рд╡рд┐рдз рдлрд┐рд▓реНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░реВ рд╢рдХрддрд╛, рдХреЕрдирд╡реНрд╣рд╛рд╕рдордзреВрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд▓реЗрд▓рд╛ рд╡реНрд╣рд┐рдбрд┐рдУ рдХреЕрдкреНрдЪрд░ рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рдирдВрддрд░ рддреЛ рдиреЗрдЯрд╡рд░реНрдХрд╡рд░реВрди рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдкрд╛рдард╡реВ рд╢рдХрддрд╛, рдЯреНрд░рд╛рдиреНрд╕рдХреЛрдб рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХрд╛рд╕рд╛рдареА рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реВ рд╢рдХрддрд╛ (hello bigo live, twitch рдЖрдгрд┐ рдЗрддрд░). рдпреЗрдереЗ рдореА рдЕрд╢рд╛ рдЧреЛрд╖реНрдЯреА рдХрд╢рд╛ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд рдпрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгрд╛рд░ рдирд╛рд╣реА, рдореА рд╡реЗрдмрд╡рд░ рд╕рд╛рдкрдбрд▓реЗрд▓реА рдХрд╛рд╣реА рдЙрджрд╛рд╣рд░рдгреЗ рджреЗрдИрди:

https://jeeliz.com/ - рдореБрд▓реЗ Javascript рдордзреНрдпреЗ рд░рд┐рдЕрд▓рдЯрд╛рдЗрдо рд╕реАрд╡реНрд╣реА рдХрд░рдд рдЖрд╣реЗрдд. рддреНрдпрд╛рдВрдЪреНрдпрд╛рдХрдбреЗ рд╕рдВрдкреВрд░реНрдг рдЖрд╣реЗ рд╢рд╕реНрддреНрд░рд╛рдЧрд╛рд░ рдХреЕрдирд╡реНрд╣рд╛рд╕рд╡рд░ рд╡реНрд╣рд┐рдбрд┐рдУ рдкреНрд░рд╡рд╛рд╣рд╛рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд┐рд╡рд┐рдз js рд▓рд╛рдпрдмреНрд░рд░реА: рдЪреЗрд╣рд░реЗ, рд╡рд╕реНрддреВ рд╢реЛрдзрдгреЗ, рдлрд┐рд▓реНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рдгреЗ (рдорд╛рд╕реНрдХ, рдЬрд╕реЗ рдХреА Instagram рдордзреНрдпреЗ), рдЗ. рддреБрдореНрд╣реА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд▓рдЧрдЗрдирд╢рд┐рд╡рд╛рдп рдереЗрдЯ рдмреНрд░рд╛рдЙрдЭрд░рдордзреНрдпреЗ рд░рд┐рдЕрд▓-рдЯрд╛рдЗрдо рд╡реНрд╣рд┐рдбрд┐рдУрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╢реА рдХрд░реВ рд╢рдХрддрд╛ рдпрд╛рдЪреЗ рдЙрддреНрдХреГрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг.

рдХреЕрдирд╡реНрд╣рд╛рд╕ рдХреЕрдкреНрдЪрд░рд╕реНрдЯреНрд░реАрдо API - рдХреЕрдирд╡реНрд╣рд╛рд╕рдордзреВрди рд╡реНрд╣рд┐рдбрд┐рдУ рдкреНрд░рд╡рд╛рд╣ рдХреЕрдкреНрдЪрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА API рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг. Chrome, Opera рдЖрдгрд┐ Firefox рдордзреНрдпреЗ рдЖрдзреАрдкрд╛рд╕реВрдирдЪ рд╕рдорд░реНрдерд┐рдд рдЖрд╣реЗ

RTCPeerConnection

рддрд░ рдЖрдореНрд╣реА рдореБрджреНрджреНрдпрд╛рд╡рд░ рдЖрд▓реЛ, рдкрд░рдВрддреБ рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рд╡реНрд╣рд┐рдбрд┐рдУ рджреБрд╕рд░реНрдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдХрдбреЗ рдХрд╕рд╛ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рд╛рдпрдЪрд╛? рд╕рдореЛрд░ рдпреЗрддреЛ RTCPeerConnection. рдереЛрдбрдХреНрдпрд╛рдд, рдЬрд╡рд│рдЬрд╡рд│ рдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░ рддреБрдореНрд╣рд╛рд▓рд╛ RTCPeerConnection рдСрдмреНрдЬреЗрдХреНрдЯ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:

const peerConnection = new RTCPeerConnection({
  iceServers: [{
    urls: 'stun:stun.l.google.com:19302'
  }]
});

рдЖрдореНрд╣реА рдкрд░реНрдпрд╛рдпрд╛рдВрдкреИрдХреА рдПрдХ рдореНрд╣рдгреВрди iceServers рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЛ - рд╣рд╛ рдПрдХ рд╕рд░реНрд╡реНрд╣рд░ рдЖрд╣реЗ рдЬреЛ NAT'om рдЪреНрдпрд╛ рдорд╛рдЧреЗ рджреЛрди рдмреНрд░рд╛рдЙрдЭрд░ рджрд░рдореНрдпрд╛рди рдХрдиреЗрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдХрд░рддреЛ. рдореНрд╣рдгрдЬреЗрдЪ, рд╕рдорд╕реНрдпреЗрдЪреЗ рдпреЗрдереЗ рдирд┐рд░рд╛рдХрд░рдг рдЭрд╛рд▓реЗ рдЖрд╣реЗ: рдЗрдВрдЯрд░рд▓реЛрдХреНрдпреВрдЯрд░рдЪрд╛ рдЖрдпрдкреА рддреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рджрд╛рддреНрдпрд╛рдЪреНрдпрд╛ NAT рдЪреНрдпрд╛ рдорд╛рдЧреЗ рдЕрд╕рд▓реНрдпрд╛рд╕ рддреЛ рдХрд╕рд╛ рд╢реЛрдзрд╛рдпрдЪрд╛? ICE рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдЪрд╛рд╡рд╛рд╕рд╛рдареА рдпреЗрддреЛ, рдЦрд░рдВ рддрд░, ICE WebRTC рд▓рд╛ рдЕрдЬрд┐рдмрд╛рдд рд▓рд╛рдЧреВ рд╣реЛрдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рдирдВрддрд░ рддреНрдпрд╛рдмрджреНрджрд▓ рдЕрдзрд┐рдХ.

рдкреВрд░реНрд╡реА, рдЖрдореНрд╣рд╛рд▓рд╛ Usermedia рдкреНрд░рд╡рд╛рд╣ рдорд┐рд│рд╛рд▓реЗ:

navigator.mediaDevices.getUserMedia({ video: true, audio: true }).then(stream => {
  // Usermedia-╨┐╨╛╤В╨╛╨║╨╕, ╨╛╨▒╤Л╤З╨╜╨╛ ╤Н╤В╨╛ ╨▓╨╕╨┤╨╡╨╛ ╨╕ ╨░╤Г╨┤╨╕╨╛ 
  const tracks = stream.getTracks();

   for (const track of tracks) {
     // ╨║╨░╨╢╨┤╤Л╨╣ ╤В╤А╨╡╨║ ╨┐╤А╨╕╤Б╨╛╨╡╨┤╨╕╨╜╤П╨╡╨╝ ╨║ peerConnection
     peerConnection.addTrack(track);
   }
}).catch(console.error);

рдкреБрдвреЗ, peerConnection рд╡рд░ рд╡рд╛рдЯрд╛рдШрд╛рдЯреА рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реБрд░реВ рд╣реЛрддреЛ, рдЬреНрдпрд╛рдЪреНрдпрд╛ рд╣рдБрдбрд▓рд░рдордзреНрдпреЗ рдЖрдореНрд╣реА рдПрдХ рдСрдлрд░ рддрдпрд╛рд░ рдХреЗрд▓реА рдкрд╛рд╣рд┐рдЬреЗ (рдПрд╕рдбреАрдкреА - рд╕рддреНрд░ рд╡рд░реНрдгрди рдкреНрд░реЛрдЯреЛрдХреЙрд▓рдЪреНрдпрд╛ рд╕рдВрджрд░реНрднрд╛рдд) рдЖрдгрд┐ рд╕реЗрдЯрд▓реЛрдХрд▓рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрд╢рди рдкрджреНрдзрддреАрджреНрд╡рд╛рд░реЗ рдкреАрдЕрд░рдХрдиреЗрдХреНрд╢рдирд▓рд╛ рддреЗ рдирд┐рдпреБрдХреНрдд рдХреЗрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ. SDP рдмрджреНрджрд▓ - рддреЗ рдХрд╛рдп рдЖрд╣реЗ рдЖрдгрд┐ рдСрдлрд░ рдЖрдгрд┐ рдЙрддреНрддрд░ рд╕реНрд╡рд░реВрдкрд╛рдВрдмрджреНрджрд▓ - рдЖрдореНрд╣реА рдкреБрдвреЗ рдмреЛрд▓реВ.

LocalDescription peerConnection рдирд┐рдпреБрдХреНрдд рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдмреНрд░рд╛рдЙрдЭрд░ рдмрд░реНрдл рдЙрдореЗрджрд╡рд╛рд░рд╛рдВрдирд╛ "рдПрдХрддреНрд░рд┐рдд" рдХрд░рддреЛ, рдореНрд╣рдгрдЬреЗрдЪ NAT рджреНрд╡рд╛рд░реЗ рд╕рдВрдкреНрд░реЗрд╖рдг рдХрд░рдгреНрдпрд╛рдЪреЗ рд╡рд┐рд╡рд┐рдз рдорд╛рд░реНрдЧ рд╢реЛрдзрддреЛ. onicegatheringstatechange рдХрд╛рд░реНрдпрдХреНрд░рдорд╛рд▓рд╛ рдЖрдЧ рд▓рд╛рдЧрд▓реА. onicegatheringstatechange рд╣рдБрдбрд▓рд░рдордзреНрдпреЗ, рдЖрдореНрд╣реА рд╕рдорд╡рдпрд╕реНрдХрд╛рдВрдордзреАрд▓ рд╕рддреНрд░ рд╡рд░реНрдгрдирд╛рдЪреА рджреЗрд╡рд╛рдгрдШреЗрд╡рд╛рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА webrtc-signaling-server рд╕реНрдЯреНрд░реАрдорд╢реА рдХрдиреЗрдХреНрд╢рдирд▓рд╛ рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЛ:

peerConnection.oniceconnectionstatechange = (event) => {
      console.log('Connection state: ', peerConnection.iceConnectionState);

      if (peerConnection.iceConnectionState === 'connected') {
        // ╨Ь╨╛╨╢╨╡╨╝ ╨░╨║╤В╨╕╨▓╨╕╤А╨╛╨▓╨░╤В╤М ╨║╨╜╨╛╨┐╨║╤Г Start broadcast
        setBroadcasting(true);
        setBroadcastingBtnActive(true);
      }
    };

// ╨б╨╛╨▒╤Л╤В╨╕╨╡ ╤Б╤А╨░╨▒╨░╤В╤Л╨▓╨░╨╡╤В ╤Б╤А╨░╨╖╤Г, ╨║╨░╨║ ╤В╨╛╨╗╤М╨║╨╛ ╨┤╨╛╨▒╨░╨▓╨╕╨╗╤Б╤П ╨╝╨╡╨┤╨░╨╕╨░╨┐╨╛╤В╨╛╨║ ╨▓ peerConnection
peerConnection.onnegotiationneeded = (event) => {
      // ╨б╨╛╨╖╨┤╨░╨╡╨╝ ╨╕ ╨╜╨░╨╖╨╜╨░╤З╨░╨╡╨╝ SDP offer
      peerConnection.createOffer().
        then((offer) => peerConnection.setLocalDescription(offer)).
        catch(console.error);
    };

// ╨б╨╛╨▒╤Л╤В╨╕╨╡ ╤Б╤А╨░╨▒╨░╤В╤Л╨▓╨░╨╡╤В ╨║╨░╨╢╨┤╤Л╨╣ ╤А╨░╨╖, ╨║╨░╨║ ╨┐╨╛╤П╨▓╨╗╤П╨╡╤В╤Б╤П ICE ╨║╨░╨╜╨┤╨╕╨┤╨░╤В
peerConnection.onicegatheringstatechange = (ev) => {
      let connection = ev.target;

      // Now we can activate broadcast button
      if (connection.iceGatheringState === 'complete') {
        let delay = 50;
        let tries = 0;
        let maxTries = 3;

        let timerId = setTimeout(function allowStreaming() {
          if (isOnline) {
            setBroadcastingBtnActive(true);
            return;
          }

          if (tries < maxTries) {
            tries += 1;
            delay *= 2;
            timerId = setTimeout(allowStreaming, delay);
          } else {
            // TODO: show user notification
            console.error("Can't connect to server");

            alert("Can't connect to server");
          }
        }, delay);
      }
    };

webrtc-signaling-server рд╣рд╛ рджреЛрди рд╕рдорд╡рдпрд╕реНрдХрд╛рдВрдордзреАрд▓ рд╕рддреНрд░ рд╡рд░реНрдгрдирд╛рдЪреА рджреЗрд╡рд╛рдгрдШреЗрд╡рд╛рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓рд╛ рд╕рд░реНрд╡реНрд╣рд░ рдЖрд╣реЗ, рддреЛ рдХреЛрдгрддреНрдпрд╛рд╣реА PL рд╡рд░ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкрд╛ рд╡реЗрдмрд╕реЙрдХреЗрдЯ рдХрд┐рдВрд╡рд╛ xhr-рд╕рд░реНрд╡реНрд╣рд░ рдЕрд╕реВ рд╢рдХрддреЛ. рддреНрдпрд╛рдЪреЗ рдХрд╛рд░реНрдп рд╕реЛрдкреЗ рдЖрд╣реЗ: рдПрдХрд╛ рд╕рдорд╡рдпрд╕реНрдХрд╛рдХрдбреВрди рд╕рддреНрд░рд╛рдЪреЗ рд╡рд░реНрдгрди рд╕реНрд╡реАрдХрд╛рд░рдгреЗ рдЖрдгрд┐ рддреЗ рджреБрд╕рд░реНтАНрдпрд╛рдХрдбреЗ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдгреЗ.

рд╕рддреНрд░ рд╡рд░реНрдгрдирд╛рдЪреНрдпрд╛ рджреЗрд╡рд╛рдгрдШреЗрд╡рд╛рдгреАрдирдВрддрд░, рджреЛрдиреНрд╣реА рдмрд╛рдЬреВ рд╡реНрд╣рд┐рдбрд┐рдУ рдкреНрд░рд╡рд╛рд╣ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддрдпрд╛рд░ рдЖрд╣реЗрдд, рдЬреНрдпрд╛ рдмрд╛рдЬреВрд▓рд╛ рд╡реНрд╣рд┐рдбрд┐рдУ рдкреНрд░рд╡рд╛рд╣ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЛ, рдСрдирдЯреНрд░реЕрдХ рдЗрд╡реНрд╣реЗрдВрдЯ рдкреАрдЕрд░рдХрдиреЗрдХреНрд╢рдирд╡рд░ рдЯреНрд░рд┐рдЧрд░ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ, рдЬреНрдпрд╛рдЪреНрдпрд╛ рд╣рдБрдбрд▓рд░рдордзреНрдпреЗ, рдкреНрд░рд╛рдкреНрдд рдЯреНрд░реЕрдХ рдирд┐рдпреБрдХреНрдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд рдЖрдгрд┐ рддреБрдордЪреНрдпрд╛ рдЖрд╡рдбрддреНрдпрд╛ рдЗрдВрдЯрд░рд▓реЛрдХреНрдпреВрдЯрд░рдХрдбреЗ рдкрд╣рд╛. рдкреБрдвреАрд▓ рд╕рд┐рджреНрдзрд╛рдВрдд рдЖрдгрд┐ рддрдкрд╢реАрд▓.

рджреБрд╡реЗ рдЖрдгрд┐ рд╕рд╛рд╣рд┐рддреНрдп:

https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection - рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг RTCPeerConnection

https://github.com/pion/webrtc - рдЬрд╛рддрд╛ рдЬрд╛рддрд╛ WebRTC рдкреНрд░реЛрдЯреЛрдХреЙрд▓рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА

https://webrtcforthecurious.com/ - pion рдЪреНрдпрд╛ рдирд┐рд░реНрдорд╛рддреНрдпрд╛рдВрдХрдбреВрди рдПрдХ рдкреБрд╕реНрддрдХ

https://hpbn.co/ - рдмреБрдХ рд╣рд╛рдп рдкрд░рдлреЙрд░реНрдордиреНрд╕ рдмреНрд░рд╛рдЙрдЭрд░ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ. рд╡реЗрдм рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕рдЪреА рдЙрдЪреНрдЪ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдореБрджреНрджреНрдпрд╛рдВрд╡рд░ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдЪрд░реНрдЪрд╛ рдХреЗрд▓реА рдЖрд╣реЗ. рд╢реЗрд╡рдЯреА, WebRTC рдЪреЗ рд╡рд░реНрдгрди рдХреЗрд▓реЗ рдЖрд╣реЗ. рдкреБрд╕реНрддрдХ рдирдХреНрдХреАрдЪ рдЬреБрдиреЗ рдЖрд╣реЗ (2013), рдкрд░рдВрддреБ рддреНрдпрд╛рдЪреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдЧрдорд╛рд╡рдд рдирд╛рд╣реА.

рдкреБрдврдЪреНрдпрд╛ рднрд╛рдЧрд╛рдд, рдмреНрд░рд╛рдЙрдЭрд░рдордзреАрд▓ рджрд░реНрд╢рдХрд╛рдВрдирд╛ рддреНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ рдкреНрд░рд╕рд╛рд░рдгрд╛рд╕рд╛рдареА ffmpeg рджреНрд╡рд╛рд░реЗ HLS рдордзреНрдпреЗ рдЯреНрд░рд╛рдиреНрд╕рдХреЛрдб рдХрд░реВрди, pion рд╡рд╛рдкрд░реВрди рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рд╡реНрд╣рд┐рдбрд┐рдУ рдкреНрд░рд╡рд╛рд╣рд╛рдЪреНрдпрд╛ рд░рд┐рд╕реЗрдкреНрд╢рди рдЖрдгрд┐ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдорд▓рд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдЖрдгрд┐ рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдд рдереЛрдбрд╛ рдЕрдзрд┐рдХ рднрд╛рдЧ рджреНрдпрд╛рдпрдЪрд╛ рдЖрд╣реЗ.

рдЕрдзреАрд░рд╛рдВрд╕рд╛рдареА: рдЯреНрд╡рд┐рдЪрдордзреНрдпреЗ pion-рдЖрдзрд╛рд░рд┐рдд рд╕рд░реНрд╡реНрд╣рд░рджреНрд╡рд╛рд░реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдгреНрдпрд╛рд╕рд╛рдареА рд╡реЗрдмрдХреЕрдорд╡рд░реВрди рд╡реНрд╣рд┐рдбрд┐рдУ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдорд╛рдЭрд╛ рдЕрддреНрдпрдВрдд рдХреНрд░реВрдб рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк (рд╣рд╛ рдлрдХреНрдд рдПрдХ рдкреНрд░рдпреЛрдЧ рдЖрд╣реЗ).

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛