(ΠŸΠΎΡ‡Ρ‚ΠΈ) Π±Π΅Π·ΠΏΠΎΠ»Π΅Π·Π΅Π½ стрийминг ΠΎΡ‚ ΡƒΠ΅Π± ΠΊΠ°ΠΌΠ΅Ρ€Π° ΠΎΡ‚ Π±Ρ€Π°ΡƒΠ·ΡŠΡ€. Част 2. WebRTC

Някак Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΎΡ‚ стари ΠΈ Π²Π΅Ρ‡Π΅ изоставСни статии, написах Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠΎΠ»ΠΊΠΎ лСсно ΠΈ СстСствСно ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·Π»ΡŠΡ‡Π²Π°Ρ‚Π΅ Π²ΠΈΠ΄Π΅ΠΎ ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Π½ΠΎ Ρ‡Ρ€Π΅Π· websockets. Π’ Ρ‚Π°Π·ΠΈ статия Π³ΠΎΠ²ΠΎΡ€ΠΈΡ… Π½Π°ΠΊΡ€Π°Ρ‚ΠΊΠΎ Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ Π΄Π° заснСмСтС Π²ΠΈΠ΄Π΅ΠΎ ΠΎΡ‚ ΠΊΠ°ΠΌΠ΅Ρ€Π° ΠΈ Π·Π²ΡƒΠΊ ΠΎΡ‚ ΠΌΠΈΠΊΡ€ΠΎΡ„ΠΎΠ½ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° API Π½Π° MediaStream, ΠΊΠ°ΠΊ Π΄Π° ΠΊΠΎΠ΄ΠΈΡ€Π°Ρ‚Π΅ получСния ΠΏΠΎΡ‚ΠΎΠΊ ΠΈ Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈΡ‚Π΅ Ρ‡Ρ€Π΅Π· websockets към ΡΡŠΡ€Π²ΡŠΡ€Π°. Π’ дСйствитСлност ΠΎΠ±Π°Ρ‡Π΅ Ρ‚Π΅ Π½Π΅ правят Ρ‚ΠΎΠ²Π°, Π·Π° ΠΈΠ·Π»ΡŠΡ‡Π²Π°Π½ΠΈΡ Ρ‚Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΠΈΠ»ΠΈ спСциалСн софтуСр, ΠΊΠΎΠΉΡ‚ΠΎ трябва Π΄Π° бъдС инсталиран ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½: Π½Π°ΠΏΡ€Π°Π²ΠΎ Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π‘ΠΎΡ„Ρ‚ΡƒΠ΅Ρ€ Π·Π° ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ΠΎ разпространСниС, ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ WebRTC, ΠΊΠΎΠΉΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ Π²Π΅Π΄Π½Π°Π³Π°, Ρ‚.Π΅. Π½Π΅ изисква инсталиранСто Π½Π° Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ плъгини a la flash player, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ изрязани ΠΎΡ‚ Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π° Chromium ΠΎΡ‰Π΅ ΠΏΡ€Π΅Π· Π΄Π΅ΠΊΠ΅ΠΌΠ²Ρ€ΠΈ.

ДнСс Ρ‰Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π·Π° WebRTC.

Π£Π΅Π± комуникацията Π² Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅ (WebRTC) Π½Π΅ Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π΅Π½ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», Π° цяла колСкция ΠΎΡ‚ стандарти, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈ ΠΈ JavaScript API, ΠΊΠΎΠΈΡ‚ΠΎ Π·Π°Π΅Π΄Π½ΠΎ осигуряват peer-to-peer Π²ΠΈΠ΄Π΅ΠΎ-Π°ΡƒΠ΄ΠΈΠΎ комуникация Π² Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅ ΠΈ ΠΌΠΎΠ³Π°Ρ‚ ΡΡŠΡ‰ΠΎ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π·Π° ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΡΠ½Π΅ Π½Π° всякакви Π΄Π²ΠΎΠΈΡ‡Π½ΠΈ Π΄Π°Π½Π½ΠΈ. ОбикновСно Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ΠΈΡ‚Π΅ дСйстват ΠΊΠ°Ρ‚ΠΎ ΠΏΠ°Ρ€Ρ‚Π½ΡŒΠΎΡ€ΠΈ, Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΈ ΠΌΠΎΠ±ΠΈΠ»Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π—Π° Π΄Π° сС ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π° p2p комуникация ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΈ, Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π° Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π²ΠΈΠ΄ΠΎΠ²Π΅ Π²ΠΈΠ΄Π΅ΠΎ ΠΈ Π°ΡƒΠ΄ΠΈΠΎ ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅, ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΡ€Π΅ΠΆΠΎΠ²ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈ, осигуряващи взаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ…Π°Ρ€Π΄ΡƒΠ΅Ρ€Π° ΠΈ Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π° (Ρ‡Ρ€Π΅Π· слоСвС Π½Π° ОБ): ΡƒΠ΅Π± ΠΊΠ°ΠΌΠ΅Ρ€ΠΈ, Π·Π²ΡƒΠΊΠΎΠ²ΠΈ ΠΊΠ°Ρ€Ρ‚ΠΈ. Цялата Ρ‚Π°Π·ΠΈ смСсица ΠΎΡ‚ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π΅ скрита Π·Π°Π΄ JavaScript API абстракцията Π·Π° удобство Π½Π° програмиста.

Всичко сС свСТда Π΄ΠΎ Ρ‚Ρ€ΠΈ API:

  • API Π½Π° MediaStream β€” Π΄Π΅ΠΌΠΎΠ½Ρ‚ΠΈΡ€Π°Π½ миналия ΠΏΡŠΡ‚, днСс Ρ‰Π΅ пиша ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° Π½Π΅Π³ΠΎ. Π‘Π»ΡƒΠΆΠΈ Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° Π²ΠΈΠ΄Π΅ΠΎ/Π°ΡƒΠ΄ΠΈΠΎ ΠΏΠΎΡ‚ΠΎΡ†ΠΈ ΠΎΡ‚ Ρ…Π°Ρ€Π΄ΡƒΠ΅Ρ€Π°

  • RTCPeer Π²Ρ€ΡŠΠ·ΠΊΠ° β€” осигурява комуникация ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Π²Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° (p2p)

  • RTCDataChannel - слуТи Π·Π° ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΡΠ½Π΅ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ Π΄Π°Π½Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Π²Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π½Π° Π°ΡƒΠ΄ΠΈΠΎ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎΡ‚ΠΎΡ†ΠΈ Π·Π° ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅

Всичко Π·Π°ΠΏΠΎΡ‡Π²Π° с β€žΡƒΠ»Π°Π²ΡΠ½Π΅Ρ‚ΠΎβ€œ Π½Π° ΠΌΠ΅Π΄ΠΈΠΉΠ½ΠΈΡ‚Π΅ ΠΏΠΎΡ‚ΠΎΡ†ΠΈ Π½Π° ΡƒΠ΅Π± ΠΊΠ°ΠΌΠ΅Ρ€Π°Ρ‚Π° ΠΈ ΠΌΠΈΠΊΡ€ΠΎΡ„ΠΎΠ½Π°. Π Π°Π·Π±ΠΈΡ€Π° сС, Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π΅Π½ΠΈΡ‚Π΅ ΠΏΠΎΡ‚ΠΎΡ†ΠΈ Π½Π΅ са подходящи Π·Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° тСлСконфСрСнция, всСки ΠΏΠΎΡ‚ΠΎΠΊ трябва Π΄Π° бъдС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π΅Π½: ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π΅Ρ‚Π΅ качСството, синхронизирайтС Π°ΡƒΠ΄ΠΈΠΎ с Π²ΠΈΠ΄Π΅ΠΎ, поставСтС ΠΌΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π·Π° синхронизиранС във Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ осигурСтС Π±ΠΈΡ‚Ρ€Π΅ΠΉΡ‚, ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π°Ρ‰ Π½Π° постоянно промСнящата сС чСстотна Π»Π΅Π½Ρ‚Π° Π½Π° ΠΊΠ°Π½Π°Π»Π° . Π‘Ρ€Π°ΡƒΠ·ΡŠΡ€ΡŠΡ‚ сС Π³Ρ€ΠΈΠΆΠΈ Π·Π° всичко Ρ‚ΠΎΠ²Π°, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡŠΡ‚ Π΄ΠΎΡ€ΠΈ Π½Π΅ трябва Π΄Π° сС притСснява Π·Π° осигуряванСто Π½Π° ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ Π·Π° ΠΌΠ΅Π΄ΠΈΠΉΠ½ΠΈ ΠΏΠΎΡ‚ΠΎΡ†ΠΈ. Π’ модСрния Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ Π²Π΅Ρ‡Π΅ ΠΈΠΌΠ° софтуСрни слоСвС Π·Π° заснСманС, подобряванС Π½Π° качСството (ΠΏΡ€Π΅ΠΌΠ°Ρ…Π²Π°Π½Π΅ Π½Π° Π΅Ρ…ΠΎΡ‚ΠΎ ΠΈ ΡˆΡƒΠΌΠ° ΠΎΡ‚ Π·Π²ΡƒΠΊΠ°, подобряванС Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Π°Ρ‚Π°), Π²ΠΈΠ΄Π΅ΠΎ ΠΈ Π°ΡƒΠ΄ΠΈΠΎ ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅. Π‘Ρ…Π΅ΠΌΠ°Ρ‚Π° Π½Π° слоСвСтС Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½Π° Ρ„ΠΈΠ³. 1:

(ΠŸΠΎΡ‡Ρ‚ΠΈ) Π±Π΅Π·ΠΏΠΎΠ»Π΅Π·Π΅Π½ стрийминг ΠΎΡ‚ ΡƒΠ΅Π± ΠΊΠ°ΠΌΠ΅Ρ€Π° ΠΎΡ‚ Π±Ρ€Π°ΡƒΠ·ΡŠΡ€. Част 2. WebRTCΠžΡ€ΠΈΠ·. 1. Π‘Π»ΠΎΠ΅Π²Π΅ Π½Π° Π°ΡƒΠ΄ΠΈΠΎ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°

Цялата ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π² самия Π±Ρ€Π°ΡƒΠ·ΡŠΡ€, Π±Π΅Π· Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ. Π½Π΅ са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π΄ΠΎΠ±Π°Π²ΠΊΠΈ. НСщата ΠΎΠ±Π°Ρ‡Π΅ всС ΠΎΡ‰Π΅ Π½Π΅ са Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° Ρ€ΠΎΠ·ΠΎΠ²ΠΈ Π·Π° 2020 Π³. Има Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ всС ΠΎΡ‰Π΅ Π½Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ напълно API Π½Π° MediaStream, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° слСдватС Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° Π·Π° ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ Π½Π°ΠΉ-Π΄ΠΎΠ»Ρƒ. IE Π² частност ΠΎΡ‚Π½ΠΎΠ²ΠΎ Π΅ Ρ€Π°Π·ΠΎΡ‡Π°Ρ€ΠΎΠ²Π°Ρ‰.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΌΠ½ΠΎΠ³ΠΎ интСрСсни Π½Π΅Ρ‰Π° с ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡ‚Π΅ ΠΏΠΎΡ‚ΠΎΡ†ΠΈ: ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΠ»ΠΎΠ½ΠΈΡ€Π°Ρ‚Π΅, Π΄Π° промСнятС Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π½Π°Ρ‚Π° способност Π½Π° Π²ΠΈΠ΄Π΅ΠΎΡ‚ΠΎ, Π΄Π° ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€Π°Ρ‚Π΅ качСството Π½Π° Π·Π²ΡƒΠΊΠ°, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²Π·Π΅ΠΌΠ΅Ρ‚Π΅ ΠΈ β€žΠΏΡ€ΠΈΠΊΠ°Ρ‡ΠΈΡ‚Π΅β€œ ΠΏΠΎΡ‚ΠΎΠΊΠ° Media Stream към ΠΌΠ°Ρ€ΠΊΠΈΡ€Π°ΠΉΡ‚Π΅ ΠΈ Π²ΠΈΠΆΡ‚Π΅ сСбС си Π½Π° html страницата. Или ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° нарисуватС ΠΏΠΎΡ‚ΠΎΠΊ Π²ΡŠΡ€Ρ…Ρƒ ΠΊΠ°Π½Π°Π²Π° ΠΈ Π΄Π° Π·Π°Π΄Π°Π΄Π΅Ρ‚Π΅ WebGL ΠΈΠ»ΠΈ CSS3 ΠΈ Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΡ‚Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ към Π²ΠΈΠ΄Π΅ΠΎΡ‚ΠΎ, Π΄Π° заснСмСтС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π΅Π½ΠΎΡ‚ΠΎ Π²ΠΈΠ΄Π΅ΠΎ ΠΎΡ‚ ΠΊΠ°Π½Π°Π²Π° ΠΈ слСд Ρ‚ΠΎΠ²Π° Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈΡ‚Π΅ ΠΏΠΎ ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° Π΄ΠΎ ΡΡŠΡ€Π²ΡŠΡ€Π°, Π΄Π° ΠΏΡ€Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Ρ‚Π΅ ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Ρ‚Π΅ Π½Π° всички (Π·Π΄Ρ€Π°Π²Π΅ΠΉ bigo live, twitch ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ). Π’ΡƒΠΊ няма Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌ ΠΊΠ°ΠΊ сС правят ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ Π½Π΅Ρ‰Π°, Ρ‰Π΅ Π΄Π°ΠΌ няколко ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈ Π² ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π°:

https://jeeliz.com/ - ΠΌΠΎΠΌΡ‡Π΅Ρ‚Π°Ρ‚Π° правят CV Π² Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π² Javascript. Π’Π΅ ΠΈΠΌΠ°Ρ‚ Π΅Π΄Π½ΠΎ цяло арсСнал Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ js Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ Π²ΡŠΡ€Ρ…Ρƒ ΠΏΠ»Π°Ρ‚Π½ΠΎ: ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°Π½Π΅ Π½Π° Π»ΠΈΡ†Π°, ΠΎΠ±Π΅ΠΊΡ‚ΠΈ, ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ (маски, ΠΊΠ°Ρ‚ΠΎ Π² Instagram) ΠΈ Ρ‚.Π½. ΠžΡ‚Π»ΠΈΡ‡Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‚Π΅ Π²ΠΈΠ΄Π΅ΠΎ Π² Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π° Π±Π΅Π· Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ плъгини.

Canvas captureStream API - API докумСнтация Π·Π° заснСманС Π½Π° Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Π½ΠΎ. Π’Π΅Ρ‡Π΅ сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Π² Chrome, Opera ΠΈ Firefox

RTCPeer Π²Ρ€ΡŠΠ·ΠΊΠ°

И Ρ‚Π°ΠΊΠ°, стигнахмС Π΄ΠΎ Π²ΡŠΠΏΡ€ΠΎΡΠ°, Π½ΠΎ ΠΊΠ°ΠΊ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π΄Π° ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΠΈΡ‚Π΅ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ»ΠΈΠΏΠ° Π½Π° Π΄Ρ€ΡƒΠ³ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»? Излиза Π½Π° ΠΏΡ€Π΅Π΄Π΅Π½ ΠΏΠ»Π°Π½ RTCPeer Π²Ρ€ΡŠΠ·ΠΊΠ°. Накратко, Π½Π° ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°Π·ΠΈ ΡΡ‚ΡŠΠΏΠΊΠ° трябва Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ ΠΎΠ±Π΅ΠΊΡ‚ RTCPeerConnection:

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

ΠŸΠΎΡΠΎΡ‡Π²Π°ΠΌΠ΅ iceServers ΠΊΠ°Ρ‚ΠΎ Π΅Π΄Π½Π° ΠΎΡ‚ ΠΎΠΏΡ†ΠΈΠΈΡ‚Π΅ - Ρ‚ΠΎΠ²Π° Π΅ ΡΡŠΡ€Π²ΡŠΡ€, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΠΎΠΌΠ°Π³Π° Π΄Π° сС осигури Π²Ρ€ΡŠΠ·ΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Π²Π° Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π° Π·Π°Π΄ NAT'om. ВоСст ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ Π΅ Ρ€Π΅ΡˆΠ΅Π½ Ρ‚ΡƒΠΊ: ΠΊΠ°ΠΊ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ ip-Ρ‚ΠΎ Π½Π° събСсСдника, Π°ΠΊΠΎ Ρ‚ΠΎΠΉ стои Π·Π°Π΄ NAT Π½Π° своя доставчик? ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΡŠΡ‚ ICE ΠΈΠ΄Π²Π° Π½Π° ΠΏΠΎΠΌΠΎΡ‰, Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ ICE ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ Π½Π΅ сС отнася Π·Π° WebRTC, Π½ΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° Ρ‚ΠΎΠ²Π° ΠΏΠΎ-късно.

ΠŸΡ€Π΅Π΄ΠΈ Ρ‚ΠΎΠ²Π° ΠΈΠΌΠ°Ρ…ΠΌΠ΅ потрСбитСлски ΠΌΠ΅Π΄ΠΈΠΉΠ½ΠΈ ΠΏΠΎΡ‚ΠΎΡ†ΠΈ:

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);

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΡΡŠΠ±ΠΈΡ‚ΠΈΠ΅Ρ‚ΠΎ onnegotiationneeded сС задСйства Π½Π° peerConnection, Π² Ρ‡ΠΈΠΉΡ‚ΠΎ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»Π°Ρ‚ΠΎΡ€ трябва Π΄Π° създадСм ΠΎΡ„Π΅Ρ€Ρ‚Π° (ΠΎΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° SDP - ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π·Π° описаниС Π½Π° сСсия) ΠΈ Π΄Π° я присвоим Π½Π° peerConnection Ρ‡Ρ€Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄Π° setLocalDescription. Π—Π° SDP - ΠΊΠ°ΠΊΠ²ΠΎ Π΅ Ρ‚ΠΎΠ²Π° ΠΈ Π·Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ‚Π΅ Π½Π° ΠΎΡ„Π΅Ρ€Ρ‚ΠΈΡ‚Π΅ ΠΈ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅ - Ρ‰Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎ.

Π‘Π»Π΅Π΄ присвояванС Π½Π° LocalDescription peerConnection, Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ΡŠΡ‚ "сглобява" ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΈ Π·Π° Π»Π΅Π΄, тоСст Π½Π°ΠΌΠΈΡ€Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½Π°Ρ‡ΠΈΠ½ΠΈ Π·Π° комуникация Ρ‡Ρ€Π΅Π· NAT. Π‘ΡŠΠ±ΠΈΡ‚ΠΈΠ΅Ρ‚ΠΎ onicegatheringstatechange сС задСйства. Π’ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»Π°Ρ‚ΠΎΡ€Π° Π½Π° onicegatheringstatechange Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π²Π°ΠΌΠ΅ Π²Ρ€ΡŠΠ·ΠΊΠ° към ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π° webrtc-signaling-ΡΡŠΡ€Π²ΡŠΡ€Π° Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° описаниСто Π½Π° сСсията ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ°Ρ€Ρ‚Π½ΡŒΠΎΡ€ΠΈ:

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-ΡΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ Π΅ ΡΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° описаниСто Π½Π° сСсията ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Π²Π°ΠΌΠ° ΠΏΠ°Ρ€Ρ‚Π½ΡŒΠΎΡ€ΠΈ, Ρ‚ΠΎΠΉ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π½Π°ΠΉ-простият websocket ΠΈΠ»ΠΈ xhr-ΡΡŠΡ€Π²ΡŠΡ€ Π½Π° всСки PL. Π—Π°Π΄Π°Ρ‡Π°Ρ‚Π° ΠΌΡƒ Π΅ проста: Π΄Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ΅ описаниС Π½Π° сСсия ΠΎΡ‚ Π΅Π΄ΠΈΠ½ ΠΏΠ°Ρ€Ρ‚Π½ΡŒΠΎΡ€ ΠΈ Π΄Π° Π³ΠΎ ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³.

Π‘Π»Π΅Π΄ ΠΎΠ±ΠΌΠ΅Π½Π° Π½Π° описания Π½Π° сСсията ΠΈ Π΄Π²Π΅Ρ‚Π΅ страни са Π³ΠΎΡ‚ΠΎΠ²ΠΈ Π·Π° ΠΈΠ·Π»ΡŠΡ‡Π²Π°Π½Π΅ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎΡ‚ΠΎΡ†ΠΈ, ΠΎΡ‚ страната, която ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° Π²ΠΈΠ΄Π΅ΠΎΠΏΠΎΡ‚ΠΎΠΊΠ°, ΡΡŠΠ±ΠΈΡ‚ΠΈΠ΅Ρ‚ΠΎ ontrack сС задСйства Π½Π° peerConnection, Π² ΠΌΠ°Π½ΠΈΠΏΡƒΠ»Π°Ρ‚ΠΎΡ€Π° Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡ‚Π΅ пСсни ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ присвоСни Π½Π° ΠΈ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ любимия си събСсСдник. Π”ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° тСория ΠΈ подробности.

Π›ΠΈΠ½ΠΊΠΎΠ²Π΅ ΠΈ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π°:

https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection - докумСнтация RTCPeer Π²Ρ€ΡŠΠ·ΠΊΠ°

https://github.com/pion/webrtc - внСдряванС Π½Π° WebRTC ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈ Π² Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅

https://webrtcforthecurious.com/ - ΠΊΠ½ΠΈΠ³Π° ΠΎΡ‚ ΡΡŠΠ·Π΄Π°Ρ‚Π΅Π»ΠΈΡ‚Π΅ Π½Π° pion

https://hpbn.co/ - Книга Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° Π² ΠΌΡ€Π΅ΠΆΠ° с високопроизводитСлСн Π±Ρ€Π°ΡƒΠ·ΡŠΡ€. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ са Ρ€Π°Π·Π³Π»Π΅Π΄Π°Π½ΠΈ Π²ΡŠΠΏΡ€ΠΎΡΠΈΡ‚Π΅ Π·Π° осигуряванС Π½Π° висока производитСлност Π½Π° ΡƒΠ΅Π± прилоТСнията. Π’ края Π΅ описан WebRTC. ΠšΠ½ΠΈΠ³Π°Ρ‚Π° със сигурност Π΅ стара (2013 Π³.), Π½ΠΎ Π½Π΅ Π³ΡƒΠ±ΠΈ своята актуалност.

Π’ слСдващата част искам Π΄Π° Π΄Π°ΠΌ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅ част ΠΎΡ‚ тСорията ΠΈ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌ ΠΏΡ€ΠΈΠ΅ΠΌΠ°Π½Π΅Ρ‚ΠΎ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° pion, ΠΏΡ€Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ Π² HLS Ρ‡Ρ€Π΅Π· ffmpeg Π·Π° послСдващо ΠΈΠ·Π»ΡŠΡ‡Π²Π°Π½Π΅ към Π·Ρ€ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°.

Π—Π° Π½Π΅Ρ‚ΡŠΡ€ΠΏΠ΅Π»ΠΈΠ²ΠΈΡ‚Π΅: моят ΠΌΠ½ΠΎΠ³ΠΎ Π³Ρ€ΡƒΠ± ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Π½Π° ΠΈΠ·Π»ΡŠΡ‡Π²Π°Π½Π΅ Π½Π° Π²ΠΈΠ΄Π΅ΠΎ ΠΎΡ‚ ΡƒΠ΅Π± ΠΊΠ°ΠΌΠ΅Ρ€Π°, Π·Π° Π΄Π° Ρ€Π΅Π°Π³ΠΈΡ€Π° ΠΏΡ€Π΅Π· Π±Π°Π·ΠΈΡ€Π°Π½ Π½Π° pion ΡΡŠΡ€Π²ΡŠΡ€ Π² twitch (Ρ‚ΠΎΠ²Π° Π΅ само СкспСримСнт).

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€