(เป€เบเบทเบญเบš) webcam เบ—เบตเปˆเบšเปเปˆเบกเบตเบ›เบฐเป‚เบซเบเบ”เบˆเบฒเบเบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš. เบชเปˆเบงเบ™เบ—เบต 2. WebRTC

somehow เปƒเบ™ ะพะดะฝะพะน เบˆเบฒเบเบšเบปเบ”เบ„เบงเบฒเบกเป€เบเบปเปˆเบฒเปเบฅเบฐเบ–เบทเบเบ›เบฐเบ–เบดเป‰เบกเป„เบงเป‰เปเบฅเป‰เบง, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ‚เบฝเบ™เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบญเบญเบเบญเบฒเบเบฒเบ”เบงเบดเบ”เบตเป‚เบญเบˆเบฒเบเบœเป‰เบฒเปƒเบšเบœเปˆเบฒเบ™ websockets เป„เบ”เป‰เบ‡เปˆเบฒเบเปเบฅเบฐเป€เบ›เบฑเบ™เบ—เปเบฒเบกเบฐเบŠเบฒเบ”. เปƒเบ™เบšเบปเบ”เบ‚เบฝเบ™เบ™เบฑเป‰เบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบงเบปเป‰เบฒเบชเบฑเป‰เบ™เป†เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบšเบฑเบ™เบ—เบถเบเบงเบดเบ”เบตเป‚เบญเบˆเบฒเบเบเป‰เบญเบ‡เบ–เปˆเบฒเบเบฎเบนเบšเปเบฅเบฐเบชเบฝเบ‡เบˆเบฒเบเป„เบกเป‚เบ„เป‚เบŸเบ™เป‚เบ”เบเปƒเบŠเป‰ MediaStream API, เบงเบดเบ—เบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบ™เป‰เปเบฒเบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเปเบฅเบฐเบชเบปเปˆเบ‡เบœเปˆเบฒเบ™ websockets เบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบžเบงเบเป€เบ‚เบปเบฒเบšเปเปˆเป„เบ”เป‰เป€เบฎเบฑเบ”เปเบ™เบงเบ™เบตเป‰, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเบญเบเบญเบฒเบเบฒเบ”เบžเบงเบเป€เบ‚เบปเบฒเปƒเบŠเป‰เบŠเบญเบšเปเบงเบžเบดเป€เบชเบ”เบ—เบตเปˆเบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบฅเบฐเบ•เบฑเป‰เบ‡เบ„เปˆเบฒ: offhand, เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™. เป€เบ›เบตเบ”เป‚เบ›เปเบเบผเบกเบญเบญเบเบญเบฒเบเบฒเบ”, เบซเบผเบทเบžเบงเบเป€เบ‚เบปเบฒเปƒเบŠเป‰ WebRTC, เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบญเบญเบเบˆเบฒเบเบเปˆเบญเบ‡, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบกเบฑเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบกเบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ plugins a la flash player, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบ–เบทเบเบ•เบฑเบ”เบญเบญเบเบˆเบฒเบเบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš Chromium เปเบฅเป‰เบงเปƒเบ™เป€เบ”เบทเบญเบ™เบ—เบฑเบ™เบงเบฒ.

เบกเบทเป‰เบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเบปเบ™เบ—เบฐเบ™เบฒเบเปˆเบฝเบงเบเบฑเบš WebRTC.

เบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เป€เบงเบฅเบฒเบˆเบดเบ‡เบ‚เบญเบ‡เป€เบงเบฑเบš (WebRTC) เบšเปเปˆเปเบกเปˆเบ™เป‚เบ›เบฃเป‚เบ•เบ„เปเบ”เบฝเบง, เบกเบฑเบ™เป€เบ›เบฑเบ™เบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™, เป‚เบ›เบฃเป‚เบ•เบ„เป เปเบฅเบฐ JavaScript APIs เบ—เบฑเบ‡เปเบปเบ”เบ—เบตเปˆเบฎเปˆเบงเบกเบเบฑเบ™เบชเบฐเปœเบญเบ‡เบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบงเบดเบ”เบตเป‚เบญ-เบชเบฝเบ‡เปเบšเบšเบชเบปเบ”เป†เปเบšเบš peer-to-peer, เปเบฅเบฐเบเบฑเบ‡เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป€เบžเบทเปˆเบญเป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ•เปˆเบฒเบ‡เป†. เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ–เบฒเบ™โ€‹เบชเบญเบ‡โ€‹. เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเป€เบฎเบฑเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเบ™เบกเบดเบ”, เปเบ•เปˆเบกเบฑเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบกเบทเบ–เบท, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡. เป€เบžเบทเปˆเบญเบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™ p2p เบฅเบฐเบซเบงเปˆเบฒเบ‡เบฅเบนเบเบ„เป‰เบฒ, เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเบชเปเบฒเบฅเบฑเบšเบ›เบฐเป€เบžเบ”เบ•เปˆเบฒเบ‡เป†เบ‚เบญเบ‡เบงเบดเบ”เบตเป‚เบญเปเบฅเบฐเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบชเบฝเบ‡เปเบกเปˆเบ™เบˆเปเบฒเป€เบ›เบฑเบ™, เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ„เบงเบฒเบกเบซเบฅเบฒเบเบซเบฅเบฒเบเบ‚เบญเบ‡เป‚เบ›เป‚เบ•เบ„เบญเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบ, เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ‚เบญเบ‡เบฎเบฒเบ”เปเบงเบเบฑเบšเบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš (เบœเปˆเบฒเบ™เบŠเบฑเป‰เบ™ OS): webcams, sound cards. เป€เบ—เบเป‚เบ™เป‚เบฅเบเบต hodgepodge เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เบ–เบทเบเป€เบŠเบทเปˆเบญเบ‡เป„เบงเป‰เบ—เบฒเบ‡เบซเบฅเบฑเบ‡เบ‚เบญเบ‡ JavaScript API abstraction เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบชเบฐเบ”เบงเบเบ‚เบญเบ‡เบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒ.

เบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ•เบปเป‰เบกเบฅเบปเบ‡เป€เบ–เบดเบ‡เบชเบฒเบก APIs:

  • MediaStream API โ€” เป„เบ”เป‰ dismantled เบ„เบฑเป‰เบ‡ เบชเบธเบ” เบ—เป‰เบฒเบ, เบกเบทเป‰ เบ™เบตเป‰ เบ‚เป‰เบฒ เบžเบฐ เป€เบˆเบปเป‰เบฒ เบˆเบฐ เบ‚เบฝเบ™ เป€เบžเบตเปˆเบก เป€เบ•เบตเบก เบเปˆเบฝเบง เบเบฑเบš เบžเบฃเบฐ เบญเบปเบ‡. เปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เป€เบžเบทเปˆเบญเบฎเบฑเบšเบชเบฒเบเบงเบดเบ”เบตเป‚เบญ / เบชเบฝเบ‡เบˆเบฒเบเบฎเบฒเบ”เปเบง

  • RTCPeerConnection - เปƒเบซเป‰โ€‹เบเบฒเบ™โ€‹เบชเบทเปˆโ€‹เบชเบฒเบ™โ€‹เบฅเบฐโ€‹เบซเบงเปˆเบฒเบ‡โ€‹เบฅเบนเบโ€‹เบ„เป‰เบฒโ€‹เบชเบญเบ‡โ€‹เบ„เบปเบ™ (p2pโ€‹)

  • เบŠเปˆเบญเบ‡ RTCData - เบฎเบฑเบšโ€‹เบœเบดเบ”โ€‹เบŠเบญเบšโ€‹เปƒเบ™โ€‹เบเบฒเบ™โ€‹เป‚เบญเบ™โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ—เบตเปˆโ€‹เบ•เบปเบ™โ€‹เป€เบญเบ‡โ€‹เบฅเบฐโ€‹เบซเบงเปˆเบฒเบ‡โ€‹เบชเบญเบ‡โ€‹เบฅเบนเบโ€‹เบ„เป‰เบฒโ€‹

เบเปเบฒเบฅเบฑเบ‡เบเบฐเบเบฝเบกเบเบฒเบ™เบ–เปˆเบฒเบเบ—เบญเบ”เบชเบฝเบ‡ เปเบฅเบฐเบงเบดเบ”เบตเป‚เบญเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ–เปˆเบฒเบเบ—เบญเบ”

เบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบ "เบเบฒเบ™เบˆเบฑเบšเบžเบฒเบš" webcam เปเบฅเบฐ microphone streams เบชเบทเปˆเบกเบงเบ™เบŠเบปเบ™. เปเบ™เปˆเบ™เบญเบ™, เบชเบฒเบเบ™เป‰เปเบฒเบ”เบดเบšเบšเปเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เบเบญเบ‡เบ›เบฐเบŠเบธเบกเป‚เบ—เบฅเบฐเบ„เบปเบก, เปเบ•เปˆเบฅเบฐเบชเบฒเบเบ™เป‰เปเบฒเบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡: เบ›เบฑเบšเบ›เบธเบ‡เบ„เบธเบ™เบ™เบฐเบžเบฒเบš, synchronize เบชเบฝเบ‡เบเบฑเบšเบงเบดเบ”เบตเป‚เบญ, เบงเบฒเบ‡เป€เบ„เบทเปˆเบญเบ‡เบซเบกเบฒเบ synchronization เปƒเบ™เบ™เป‰เปเบฒเบงเบดเบ”เบตเป‚เบญ, เปเบฅเบฐเบฎเบฑเบšเบ›เบฐเบเบฑเบ™ bitrate เบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบšเปเบšเบ™เบงเบดเบ”เบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡เบ‚เบญเบ‡เบŠเปˆเบญเบ‡. . เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเบ”เบนเปเบฅเบชเบดเปˆเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰, เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบเบฑเบ‡เบงเบปเบ™เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ–เปˆเบฒเบเบ—เบญเบ”เบชเบทเปˆ. เบžเบฒเบเปƒเบ™เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบก, เบกเบตเบŠเบฑเป‰เบ™เบŠเบญเบšเปเบงเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบˆเบฑเบšเบžเบฒเบš, เบ›เบฑเบšเบ›เบธเบ‡เบ„เบธเบ™เบ™เบฐเบžเบฒเบš (เป€เบญเบปเบฒเบชเบฝเบ‡เบชเบฐเบ—เป‰เบญเบ™เปเบฅเบฐเบชเบฝเบ‡เบญเบญเบเบˆเบฒเบเบชเบฝเบ‡, เบ›เบฑเบšเบ›เบธเบ‡เบฎเบนเบšเบžเบฒเบš), เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบงเบดเบ”เบตเป‚เบญเปเบฅเบฐเบชเบฝเบ‡. เป‚เบ„เบ‡เบฎเปˆเบฒเบ‡เบเบฒเบ™เบ‚เบญเบ‡เบŠเบฑเป‰เบ™เปเบกเปˆเบ™เบชเบฐเปเบ”เบ‡เบขเบนเปˆเปƒเบ™เบฎเบนเบš. 1:

(เป€เบเบทเบญเบš) webcam เบ—เบตเปˆเบšเปเปˆเบกเบตเบ›เบฐเป‚เบซเบเบ”เบˆเบฒเบเบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš. เบชเปˆเบงเบ™เบ—เบต 2. WebRTCเป€เบ‚เบปเป‰เบฒ. 1. เบŠเบฑเป‰เบ™เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบชเบฝเบ‡เปเบฅเบฐเบงเบดเบ”เบตเป‚เบญเปƒเบ™เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš

เบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เป€เบเบตเบ”เบ‚เบถเป‰เบ™เป‚เบ”เบเบเบปเบ‡เปƒเบ™เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡, เบšเปเปˆเบกเบตเบเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบก. เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบกเบต plugins. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบชเบดเปˆเบ‡เบ•เปˆเบฒเบ‡เป†เบเบฑเบ‡เบšเปเปˆเป€เบ›เบฑเบ™เบ—เบตเปˆเบชเบปเบ”เปƒเบชเบชเปเบฒเบฅเบฑเบšเบ›เบต 2020. เบกเบตเบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเบ—เบตเปˆเบเบฑเบ‡เบšเปเปˆเบ—เบฑเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบขเปˆเบฒเบ‡เป€เบ•เบฑเบกเบชเปˆเบงเบ™ MediaStream API, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปเบฅเบฐเป€เบšเบดเปˆเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบขเบนเปˆเบฅเบธเปˆเบกเบชเบธเบ”. IE เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡เปเบกเปˆเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบซเบงเบฑเบ‡.

เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป€เบฎเบฑเบ”โ€‹เบชเบดเปˆเบ‡โ€‹เบ—เบตเปˆโ€‹เบซเบ™เป‰เบฒโ€‹เบชเบปเบ™โ€‹เปƒเบˆโ€‹เบซเบผเบฒเบโ€‹เบเบฑเบšโ€‹เบเบฒเบ™โ€‹เบชเบฐโ€‹เบ•โ€‹เบฃเบตเบกโ€‹เบ—เบตเปˆโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹: เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ” cloneโ€‹, เบเบฒเบ™โ€‹เบ›เปˆเบฝเบ™โ€‹เปเบ›เบ‡โ€‹เบ„เบงเบฒเบกโ€‹เบฅเบฐโ€‹เบญเบฝเบ”โ€‹เบงเบดโ€‹เบ”เบตโ€‹เป‚เบญโ€‹, เบเบฒเบ™โ€‹เบˆเบฑเบ”โ€‹เบเบฒเบ™โ€‹เบ„เบธเบ™โ€‹เบ™เบฐโ€‹เบžเบฒเบšโ€‹เบชเบฝเบ‡โ€‹, เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป€เบญเบปเบฒโ€‹เปเบฅเบฐ "เบ•เบดเบ”โ€‹" stream Media Stream เบเบฑเบš tag เปเบฅเบฐเป€เบšเบดเปˆเบ‡เบ•เบปเบงเบ—เปˆเบฒเบ™เป€เบญเบ‡เบขเบนเปˆเปƒเบ™เบซเบ™เป‰เบฒ html. เบซเบผเบทเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เปเบ•เป‰เบก stream เป€เบ—เบดเบ‡ canvas, เปเบฅเบฐเบ•เบฑเป‰เบ‡ WebGL เบซเบผเบท CSS3, เปเบฅเบฐเบ™เปเบฒเปƒเบŠเป‰เบ•เบปเบงเบเบญเบ‡เบ•เปˆเบฒเบ‡เป†เปƒเบชเปˆเบงเบดเบ”เบตเป‚เบญ, เบšเบฑเบ™เบ—เบถเบเบงเบดเบ”เบตเป‚เบญเบ—เบตเปˆเบ›เบธเบ‡เปเบ•เปˆเบ‡เบˆเบฒเบ canvas เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบชเบปเปˆเบ‡เบœเปˆเบฒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเป„เบ›เบซเบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ, transcode เปเบฅเบฐเป€เบœเบตเบเปเบœเปˆเปƒเบซเป‰เบ—เบธเบเบ„เบปเบ™ (เบชเบฐเบšเบฒเบเบ”เบต bigo live, twitch เปเบฅเบฐโ€‹เบญเบทเปˆเบ™เป†). เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบšเปเปˆเป„เบ”เป‰เบงเบดเป€เบ„เบฒเบฐเบงเบดเบ—เบตเบเบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป€เบฎเบฑเบ”, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเปƒเบซเป‰เบชเบญเบ‡เบชเบฒเบกเบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบžเบปเบšเป€เบซเบฑเบ™เบขเบนเปˆเปƒเบ™เป€เบงเบฑเบš:

https://jeeliz.com/ - เบœเบนเป‰เบŠเบฒเบเบเปเบฒเบฅเบฑเบ‡เป€เบฎเบฑเบ” CV เปƒเบ™เป€เบงเบฅเบฒเบˆเบดเบ‡เปƒเบ™ Javascript. เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบกเบตเบ—เบฑเบ‡เบซเบกเบปเบ” เบ„เบฑเบ‡เบญเบฒเบงเบธเบ” เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” js เบ•เปˆเบฒเบ‡เป†เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบเบฒเบ™เบ–เปˆเบฒเบเบ—เบญเบ”เบงเบดเบ”เบตเป‚เบญเปƒเบ™เบœเป‰เบฒเปƒเบš: เบเบฒเบ™เบเบงเบ”เบชเบญเบšเปƒเบšเบซเบ™เป‰เบฒ, เบงเบฑเบ”เบ–เบธ, เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡ (เบซเบ™เป‰เบฒเบเบฒเบ, เป€เบŠเบฑเปˆเบ™เปƒเบ™ Instagram), เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบ”เบตเป€เบฅเบตเบ”เบ‚เบญเบ‡เบงเบดเบ—เบตเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบงเบดเบ”เบตเป‚เบญเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เป„เบ”เป‰เป‚เบ”เบเบเบปเบ‡เปƒเบ™เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™ plugins เป€เบžเบตเปˆเบกเป€เบ•เบตเบก.

Canvas captureStream API - เป€เบญโ€‹เบเบฐโ€‹เบชเบฒเบ™ API เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบˆเบฑเบšโ€‹เบชเบฐโ€‹เบ•โ€‹เบฃเบตเบกโ€‹เบงเบดโ€‹เบ”เบตโ€‹เป‚เบญโ€‹เบˆเบฒเบ canvasโ€‹. เบฎเบญเบ‡เบฎเบฑเบšเปƒเบ™ Chrome, Opera เปเบฅเบฐ Firefox เปเบฅเป‰เบง

RTCPeerConnection

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบกเบฒเบฎเบญเบ”เบˆเบธเบ”, เปเบ•เปˆเบ•เบปเบงเบˆเบดเบ‡เปเบฅเป‰เบงเบงเบดเบ—เบตเบเบฒเบ™เป‚เบญเบ™เบงเบดเบ”เบตเป‚เบญเปƒเบซเป‰เบเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เบญเบทเปˆเบ™เป„เบ”เป‰เปเบ™เบงเปƒเบ”? เบกเบฒเบเปˆเบญเบ™ RTCPeerConnection. เปƒเบ™เบชเบฑเป‰เบ™, เปƒเบ™เป€เบเบทเบญเบšเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ™เบตเป‰, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เบงเบฑเบ”เบ–เบธ RTCPeerConnection:

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

เบžเบงเบเป€เบฎเบปเบฒเบฅเบฐเบšเบธ iceServers เป€เบ›เบฑเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบ - เบ™เบตเป‰เปเบกเปˆเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบตเปˆเบŠเปˆเบงเบเบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบฅเบฐเบซเบงเปˆเบฒเบ‡เบชเบญเบ‡เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเบ—เบตเปˆเบขเบนเปˆเป€เบšเบทเป‰เบญเบ‡เบซเบผเบฑเบ‡ NAT'om. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบšเบฑเบ™เบซเบฒเป„เบ”เป‰เบ–เบทเบเปเบเป‰เป„เบ‚เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰: เบงเบดเบ—เบตเบเบฒเบ™เบŠเบญเบเบซเบฒ ip เบ‚เบญเบ‡ interlocutor เบ–เป‰เบฒเบฅเบฒเบงเบขเบนเปˆเป€เบšเบทเป‰เบญเบ‡เบซเบผเบฑเบ‡ NAT เบ‚เบญเบ‡เบœเบนเป‰เปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เบ‚เบญเบ‡เบฅเบฒเบง? เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒ ICE เบกเบฒเบŠเปˆเบงเบ, เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, ICE เบšเปเปˆเป„เบ”เป‰เบ™เปเบฒเปƒเบŠเป‰เบเบฑเบš WebRTC เบ—เบฑเบ‡เบซเบกเบปเบ”, เปเบ•เปˆเบกเบตเบซเบผเบฒเบเบเบงเปˆเบฒเบ™เบฑเป‰เบ™เบ•เปเปˆเบกเบฒ.

เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบš Usermedia streams:

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 - Session Description Protocol) เปเบฅเบฐเบกเบญเบšเบซเบกเบฒเบเปƒเบซเป‰ peerConnection เบœเปˆเบฒเบ™เบงเบดเบ—เบตเบเบฒเบ™ setLocalDescription. เบเปˆเบฝเบงเบเบฑเบš SDP - เบกเบฑเบ™เปเบกเปˆเบ™เบซเบเบฑเบ‡เปเบฅเบฐเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบชเบฐเป€เบซเบ™เบตเปเบฅเบฐเบฎเบนเบšเปเบšเบšเบ„เปเบฒเบ•เบญเบš - เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเบปเบ™เบ—เบฐเบ™เบฒเบ•เบทเปˆเบกเบญเบตเบ.

เบซเบผเบฑเบ‡เบˆเบฒเบเบกเบญเบšเบซเบกเบฒเบ LocalDescription peerConnection, เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš "เบ›เบฐเบเบญเบš" เบœเบนเป‰เบชเบฐเบซเบกเบฑเบเบเป‰เบญเบ™, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบŠเบญเบเบซเบฒเบงเบดเบ—เบตเบ•เปˆเบฒเบ‡เป†เปƒเบ™เบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบœเปˆเบฒเบ™ NAT. เป€เบซเบ”เบเบฒเบ™ onicegatheringstatechange เป„เบŸเป„เบซเบกเป‰. เปƒเบ™ onicegatheringstatechange handler, เบžเบงเบเป€เบฎเบปเบฒเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบš webrtc-signaling-server stream เป€เบžเบทเปˆเบญเปเบฅเบเบ›เปˆเบฝเบ™ Session Description เบฅเบฐเบซเบงเปˆเบฒเบ‡เป€เบžเบทเปˆเบญเบ™เบกเบดเบ”:

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 เปเบกเปˆเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบทเปˆเบญเปเบฅเบเบ›เปˆเบฝเบ™เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบเบญเบ‡เบ›เบฐเบŠเบธเบกเบฅเบฐเบซเบงเปˆเบฒเบ‡เบชเบญเบ‡เบ„เบปเบ™, เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™ websocket เบ—เบตเปˆเบ‡เปˆเบฒเบเบ—เบตเปˆเบชเบธเบ”เบซเบผเบท xhr-server เปƒเบ™ PL เปƒเบ”. เบงเบฝเบโ€‹เบ‡เบฒเบ™โ€‹เบ‚เบญเบ‡โ€‹เบกเบฑเบ™โ€‹เปเบกเปˆเบ™โ€‹เบ‡เปˆเบฒเบโ€‹เบ”เบฒเบโ€‹: เป€เบžเบทเปˆเบญโ€‹เบฎเบฑเบšโ€‹เป€เบญเบปเบฒโ€‹เบ„เปเบฒโ€‹เบญเบฐโ€‹เบ—เบดโ€‹เบšเบฒเบโ€‹เบ‚เบญเบ‡โ€‹เบเบญเบ‡โ€‹เบ›เบฐโ€‹เบŠเบธเบกโ€‹เบˆเบฒเบโ€‹เป€เบžเบทเปˆเบญเบ™โ€‹เบฎเปˆเบงเบกโ€‹เบ‡เบฒเบ™โ€‹เบซเบ™เบถเปˆเบ‡โ€‹เปเบฅเบฐโ€‹เป‚เบญเบ™โ€‹เบกเบฑเบ™โ€‹เบเบฑเบšโ€‹เบ„เบปเบ™โ€‹เบญเบทเปˆเบ™โ€‹.

เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เปเบฅเบเบ›เปˆเบฝเบ™เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบ Session, เบ—เบฑเบ‡เบชเบญเบ‡เบเปˆเบฒเบเบžเป‰เบญเบกเบ—เบตเปˆเบˆเบฐเบญเบญเบเบญเบฒเบเบฒเบ”เปเบฅเบฐเบฎเบฑเบšเบชเบฒเบเบงเบดเบ”เบตเป‚เบญ, เปƒเบ™เบ”เป‰เบฒเบ™เบ—เบตเปˆเบฎเบฑเบšเบชเบฒเบเบงเบดเบ”เบตเป‚เบญ, เป€เบซเบ”เบเบฒเบ™ ontrack เป„เบ”เป‰เบ–เบทเบเบเบฐเบ•เบธเป‰เบ™เบขเบนเปˆเปƒเบ™ peerConnection, เปƒเบ™ handler เบ‚เบญเบ‡เบ—เบตเปˆ, เบ•เบดเบ”เบ•เบฒเบกเบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบกเบญเบšเบซเบกเบฒเบเปƒเบซเป‰. เปเบฅเบฐเป€เบšเบดเปˆเบ‡ interlocutor เบ—เบตเปˆเบ—เปˆเบฒเบ™เบกเบฑเบ. เบ—เบดเบ”เบชเบฐเบ”เบต เปเบฅเบฐเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก.

เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปเบฅเบฐเบงเบฑเบ™เบ™เบฐเบ„เบฐเบ”เบต:

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), เปเบ•เปˆเบšเปเปˆเป„เบ”เป‰เบชเบนเบ™เป€เบชเบเบ„เบงเบฒเบกเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบ‚เบญเบ‡เบกเบฑเบ™.

เปƒเบ™เบชเปˆเบงเบ™เบ•เปเปˆเป„เบ›, เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบซเป‰เบšเบฒเบ‡เบชเปˆเบงเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบ‚เบญเบ‡เบ—เบดเบ”เบชเบฐเบ”เบตเปเบฅเบฐเปƒเบ™เบžเบฒเบเบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบžเบทเปˆเบญเบงเบดเป€เบ„เบฒเบฐเบเบฒเบ™เบฎเบฑเบšเปเบฅเบฐเบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบงเบดเบ”เบตเป‚เบญเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป‚เบ”เบเปƒเบŠเป‰ pion, transcoding เบเบฑเบš HLS เบœเปˆเบฒเบ™ ffmpeg เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเบญเบเบญเบฒเบเบฒเบ”เบ•เปเปˆเป„เบ›เปƒเบ™เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš.

เบชเบณเบฅเบฑเบšเบ„เบปเบ™เบญเบปเบ”เบ—เบปเบ™: เบ•เบปเป‰เบ™เปเบšเบšเบ—เบตเปˆเป‚เบซเบ”เบฎเป‰เบฒเบเบซเบผเบฒเบเบ‚เบญเบ‡เบ‚เป‰เบญเบเปƒเบ™เบเบฒเบ™เบญเบญเบเบญเบฒเบเบฒเบ”เบงเบดเบ”เบตเป‚เบญเบˆเบฒเบเป€เบงเบฑเบšเปเบ„เบกเป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบเบดเบฅเบดเบเบฒเบœเปˆเบฒเบ™เป€เบŠเบตเบšเป€เบงเบตเบ—เบตเปˆเบญเบตเบ‡เปƒเบชเปˆ pion เปƒเบ™ twitch (เบ™เบตเป‰โ€‹เป€เบ›เบฑเบ™โ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบฅเบญเบ‡โ€‹)โ€‹.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™