Игорь Шеко

Front-end team lead

Voximplant

Почему WebRTC это просто и сложно?

Почему WebRTC это просто и сложно?

const pc = new RTCPeerConnection();
await localDescription = pc.createOffer();
await pc.setLocalDescription(localDescription);
ws.send(JSON.stringify(localDescription));
ws.addEventListener('message',(data)=>{
	await pc.setRemoteDescription(JSON.parse(data));
})

Почему WebRTC это просто и сложно?

const pc = new RTCPeerConnection();
await localDescription = pc.createOffer();
await pc.setLocalDescription(localDescription);
ws.send(JSON.stringify(localDescription));
ws.addEventListener('message',(data)=>{
	await pc.setRemoteDescription(JSON.parse(data));
})

Почему WebRTC это просто и сложно?

const pc = new RTCPeerConnection();
await localDescription = pc.createOffer();
await pc.setLocalDescription(localDescription);
ws.send(JSON.stringify(localDescription));
ws.addEventListener('message',(data)=>{
	await pc.setRemoteDescription(JSON.parse(data));
})

SDP

UDP

ICE

TURN

STUN

RTP

RTCP

VAD

.....

Основные проблемы, с которыми столкнетесь

  • Все очень просто, когда оно работает и очень сложно, когда нет

Основные проблемы, с которыми столкнетесь

  • AAAA "Ярость тысячи солнц!!!"

Основные проблемы, с которыми столкнетесь

  • AAAA "Ярость тысячи солнц!!!"

  • SDP aka Session Description Protocol

Основные проблемы, с которыми столкнетесь

  • AAAA "Ярость тысячи солнц!!!"

  • SDP aka Session Description Protocol

v=0
o=VIMS 234 3 IN IP4 82.202.208.157
s=VIMS
c=IN IP4 82.202.208.157
b=TIAS:13888000
t=0 0
a=fingerprint:sha-256 A8:9E:DF:90:91:96:82:E6:75:6B:EA:B7:40:01:B8:2C:C4:B3:66:77:32:46:A4:D4:0F:1F:C2:38:2E:FF:0A:0F
a=msid-semantic:WMS *
a=group:BUNDLE 0 1
a=ice-ufrag:147B29E6
a=ice-pwd:FBD23B73886E790A61BD19E2D5EF
m=audio 11552 UDP/TLS/RTP/SAVPF 111 126
b=TIAS:64000
b=AS:64
a=mid:0
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10; useinbandfec=1; stereo=0; usedtx=1
a=rtpmap:126 telephone-event/8000
a=fmtp:126 0-15
a=recvonly
a=rtcp-mux
a=setup:actpass
a=candidate:1 1 UDP 100 82.202.208.157 11552 typ host generation 0
a=end-of-candidates
a=msid:FFE3AD86B874A2DB728FB39D0C59FDBEC9276AD2246D738E50D136E323C117FD BEC5275300EC4A1B0E9CC33E29295B019C6C4BF4CE0082B9045D89BA2D378382
a=ssrc:1801710709 msid:FFE3AD86B874A2DB728FB39D0C59FDBEC9276AD2246D738E50D136E323C117FD BEC5275300EC4A1B0E9CC33E29295B019C6C4BF4CE0082B9045D89BA2D378382
a=ssrc:1801710709 cname:cname_140498853493008
a=ssrc:1801710709 mslabel:EB2392158ECBD6A3
a=ssrc:1801710709 label:EB2392158ECBD6A300
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=ptime:20
m=video 11552 UDP/TLS/RTP/SAVPF 96 97
b=TIAS:500000
b=AS:500
a=mid:1
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=recvonly
a=rtcp-mux
a=setup:actpass
a=candidate:1 1 UDP 100 82.202.208.157 11552 typ host generation 0
a=end-of-candidates
a=msid:DFEE9389E7E906F55A9CE4890619BA189F632EC05AA509A634228AB80D2B7330 3226883E95655FA3BC64E7A65622DC60E8761A5AFBF5B9865FA464ACBCE89487
a=ssrc-group:FID 379754258 1387682306
a=ssrc:379754258 msid:DFEE9389E7E906F55A9CE4890619BA189F632EC05AA509A634228AB80D2B7330 3226883E95655FA3BC64E7A65622DC60E8761A5AFBF5B9865FA464ACBCE89487
a=ssrc:379754258 cname:cname_140498853493008
a=ssrc:379754258 mslabel:9347F4C9E1A8C0B0
a=ssrc:379754258 label:9347F4C9E1A8C0B010
a=ssrc:1387682306 msid:DFEE9389E7E906F55A9CE4890619BA189F632EC05AA509A634228AB80D2B7330 3226883E95655FA3BC64E7A65622DC60E8761A5AFBF5B9865FA464ACBCE89487
a=ssrc:1387682306 cname:cname_140498853493008
a=ssrc:1387682306 mslabel:D8C90C628D5BD751
a=ssrc:1387682306 label:D8C90C628D5BD75110
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:11 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:13 urn:3gpp:video-orientation
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset

Основные проблемы, с которыми столкнетесь

  • AAAA "Ярость тысячи солнц!!!"

  • SDP aka Session Description Protocol

v=0
o=VIMS 234 3 IN IP4 82.202.208.157
s=VIMS
c=IN IP4 82.202.208.157
b=TIAS:13888000
t=0 0
a=fingerprint:sha-256 A8:9E:DF:90:91:96:82:E6:75:6B:EA:B7:40:01:B8:2C:C4:B3:66:77:32:46:A4:D4:0F:1F:C2:38:2E:FF:0A:0F
a=msid-semantic:WMS *
a=group:BUNDLE 0 1
a=ice-ufrag:147B29E6
a=ice-pwd:FBD23B73886E790A61BD19E2D5EF
m=audio 11552 UDP/TLS/RTP/SAVPF 111 126
b=TIAS:64000
b=AS:64
a=mid:0
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10; useinbandfec=1; stereo=0; usedtx=1
a=rtpmap:126 telephone-event/8000
a=fmtp:126 0-15
a=recvonly
a=rtcp-mux
a=setup:actpass
a=candidate:1 1 UDP 100 82.202.208.157 11552 typ host generation 0
a=end-of-candidates
a=msid:FFE3AD86B874A2DB728FB39D0C59FDBEC9276AD2246D738E50D136E323C117FD BEC5275300EC4A1B0E9CC33E29295B019C6C4BF4CE0082B9045D89BA2D378382
a=ssrc:1801710709 msid:FFE3AD86B874A2DB728FB39D0C59FDBEC9276AD2246D738E50D136E323C117FD BEC5275300EC4A1B0E9CC33E29295B019C6C4BF4CE0082B9045D89BA2D378382
a=ssrc:1801710709 cname:cname_140498853493008
a=ssrc:1801710709 mslabel:EB2392158ECBD6A3
a=ssrc:1801710709 label:EB2392158ECBD6A300
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=ptime:20
m=video 11552 UDP/TLS/RTP/SAVPF 96 97
b=TIAS:500000
b=AS:500
a=mid:1
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=recvonly
a=rtcp-mux
a=setup:actpass
a=candidate:1 1 UDP 100 82.202.208.157 11552 typ host generation 0
a=end-of-candidates
a=msid:DFEE9389E7E906F55A9CE4890619BA189F632EC05AA509A634228AB80D2B7330 3226883E95655FA3BC64E7A65622DC60E8761A5AFBF5B9865FA464ACBCE89487
a=ssrc-group:FID 379754258 1387682306
a=ssrc:379754258 msid:DFEE9389E7E906F55A9CE4890619BA189F632EC05AA509A634228AB80D2B7330 3226883E95655FA3BC64E7A65622DC60E8761A5AFBF5B9865FA464ACBCE89487
a=ssrc:379754258 cname:cname_140498853493008
a=ssrc:379754258 mslabel:9347F4C9E1A8C0B0
a=ssrc:379754258 label:9347F4C9E1A8C0B010
a=ssrc:1387682306 msid:DFEE9389E7E906F55A9CE4890619BA189F632EC05AA509A634228AB80D2B7330 3226883E95655FA3BC64E7A65622DC60E8761A5AFBF5B9865FA464ACBCE89487
a=ssrc:1387682306 cname:cname_140498853493008
a=ssrc:1387682306 mslabel:D8C90C628D5BD751
a=ssrc:1387682306 label:D8C90C628D5BD75110
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:11 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:13 urn:3gpp:video-orientation
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset

Основные проблемы, с которыми столкнетесь

  • AAAA "Ярость тысячи солнц!!!"

  • SDP aka Session Description Protocol

v=0
o=VIMS 234 3 IN IP4 82.202.208.157
s=VIMS
c=IN IP4 82.202.208.157
b=TIAS:13888000
t=0 0
a=fingerprint:sha-256 A8:9E:DF:90:91:96:82:E6:75:6B:EA:B7:40:01:B8:2C:C4:B3:66:77:32:46:A4:D4:0F:1F:C2:38:2E:FF:0A:0F
a=msid-semantic:WMS *
a=group:BUNDLE 0 1
a=ice-ufrag:147B29E6
a=ice-pwd:FBD23B73886E790A61BD19E2D5EF
m=audio 11552 UDP/TLS/RTP/SAVPF 111 126
b=TIAS:64000
b=AS:64
a=mid:0
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10; useinbandfec=1; stereo=0; usedtx=1
a=rtpmap:126 telephone-event/8000
a=fmtp:126 0-15
a=recvonly
a=rtcp-mux
a=setup:actpass
a=candidate:1 1 UDP 100 82.202.208.157 11552 typ host generation 0
a=end-of-candidates
a=msid:FFE3AD86B874A2DB728FB39D0C59FDBEC9276AD2246D738E50D136E323C117FD BEC5275300EC4A1B0E9CC33E29295B019C6C4BF4CE0082B9045D89BA2D378382
a=ssrc:1801710709 msid:FFE3AD86B874A2DB728FB39D0C59FDBEC9276AD2246D738E50D136E323C117FD BEC5275300EC4A1B0E9CC33E29295B019C6C4BF4CE0082B9045D89BA2D378382
a=ssrc:1801710709 cname:cname_140498853493008
a=ssrc:1801710709 mslabel:EB2392158ECBD6A3
a=ssrc:1801710709 label:EB2392158ECBD6A300
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=ptime:20
m=video 11552 UDP/TLS/RTP/SAVPF 96 97
b=TIAS:500000
b=AS:500
a=mid:1
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=recvonly
a=rtcp-mux
a=setup:actpass
a=candidate:1 1 UDP 100 82.202.208.157 11552 typ host generation 0
a=end-of-candidates
a=msid:DFEE9389E7E906F55A9CE4890619BA189F632EC05AA509A634228AB80D2B7330 3226883E95655FA3BC64E7A65622DC60E8761A5AFBF5B9865FA464ACBCE89487
a=ssrc-group:FID 379754258 1387682306
a=ssrc:379754258 msid:DFEE9389E7E906F55A9CE4890619BA189F632EC05AA509A634228AB80D2B7330 3226883E95655FA3BC64E7A65622DC60E8761A5AFBF5B9865FA464ACBCE89487
a=ssrc:379754258 cname:cname_140498853493008
a=ssrc:379754258 mslabel:9347F4C9E1A8C0B0
a=ssrc:379754258 label:9347F4C9E1A8C0B010
a=ssrc:1387682306 msid:DFEE9389E7E906F55A9CE4890619BA189F632EC05AA509A634228AB80D2B7330 3226883E95655FA3BC64E7A65622DC60E8761A5AFBF5B9865FA464ACBCE89487
a=ssrc:1387682306 cname:cname_140498853493008
a=ssrc:1387682306 mslabel:D8C90C628D5BD751
a=ssrc:1387682306 label:D8C90C628D5BD75110
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:11 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:13 urn:3gpp:video-orientation
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset

Основные проблемы, с которыми столкнетесь

  • AAAA "Ярость тысячи солнц!!!"

  • SDP aka Session Description Protocol

v=0
o=- 5347596606922166072 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=msid-semantic: WMS FvmNLU19WeY9BUV1gADTjIClqPoD9kLEQRM8
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:kEZv
a=ice-pwd:UVVeJzFoQtu3q/Ce7ZHxALL/
a=ice-options:trickle
a=fingerprint:sha-256 9F:01:6A:41:DB:4C:51:24:D0:03:88:54:82:39:36:D4:8D:9F:98:6E:E3:91:0F:EA:0C:B1:DC:B8:9D:86:23:BF
a=setup:actpass
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=sendrecv
a=msid:FvmNLU19WeY9BUV1gADTjIClqPoD9kLEQRM8 e77fa72f-bfd5-44c2-9484-ece0bcccc608
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:112 telephone-event/32000
a=rtpmap:113 telephone-event/16000
a=rtpmap:126 telephone-event/8000
a=ssrc:3612809170 cname:ryzJvE++b30SqEMY
a=ssrc:3612809170 msid:FvmNLU19WeY9BUV1gADTjIClqPoD9kLEQRM8 e77fa72f-bfd5-44c2-9484-ece0bcccc608
a=ssrc:3612809170 mslabel:FvmNLU19WeY9BUV1gADTjIClqPoD9kLEQRM8
a=ssrc:3612809170 label:e77fa72f-bfd5-44c2-9484-ece0bcccc608
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123 118 114 115 116
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:kEZv
a=ice-pwd:UVVeJzFoQtu3q/Ce7ZHxALL/
a=ice-options:trickle
a=fingerprint:sha-256 9F:01:6A:41:DB:4C:51:24:D0:03:88:54:82:39:36:D4:8D:9F:98:6E:E3:91:0F:EA:0C:B1:DC:B8:9D:86:23:BF
a=setup:actpass
a=mid:1
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:13 urn:3gpp:video-orientation
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:12 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:11 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=sendrecv
a=msid:FvmNLU19WeY9BUV1gADTjIClqPoD9kLEQRM8 89a636c3-3036-4b4b-8a39-e074bd6a5371
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:121 rtx/90000
a=fmtp:121 apt=102
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:120 rtx/90000
a=fmtp:120 apt=127
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:124 H264/90000
a=rtcp-fb:124 goog-remb
a=rtcp-fb:124 transport-cc
a=rtcp-fb:124 ccm fir
a=rtcp-fb:124 nack
a=rtcp-fb:124 nack pli
a=fmtp:124 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d001f
a=rtpmap:119 rtx/90000
a=fmtp:119 apt=124
a=rtpmap:123 H264/90000
a=rtcp-fb:123 goog-remb
a=rtcp-fb:123 transport-cc
a=rtcp-fb:123 ccm fir
a=rtcp-fb:123 nack
a=rtcp-fb:123 nack pli
a=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=64001f
a=rtpmap:118 rtx/90000
a=fmtp:118 apt=123
a=rtpmap:114 red/90000
a=rtpmap:115 rtx/90000
a=fmtp:115 apt=114
a=rtpmap:116 ulpfec/90000
a=ssrc-group:FID 3399325948 3051746980
a=ssrc:3399325948 cname:ryzJvE++b30SqEMY
a=ssrc:3399325948 msid:FvmNLU19WeY9BUV1gADTjIClqPoD9kLEQRM8 89a636c3-3036-4b4b-8a39-e074bd6a5371
a=ssrc:3399325948 mslabel:FvmNLU19WeY9BUV1gADTjIClqPoD9kLEQRM8
a=ssrc:3399325948 label:89a636c3-3036-4b4b-8a39-e074bd6a5371
a=ssrc:3051746980 cname:ryzJvE++b30SqEMY
a=ssrc:3051746980 msid:FvmNLU19WeY9BUV1gADTjIClqPoD9kLEQRM8 89a636c3-3036-4b4b-8a39-e074bd6a5371
a=ssrc:3051746980 mslabel:FvmNLU19WeY9BUV1gADTjIClqPoD9kLEQRM8
a=ssrc:3051746980 label:89a636c3-3036-4b4b-8a39-e074bd6a5371

На самом деле я его порезал ...

Основные проблемы, с которыми столкнетесь

  • AAAA "Ярость тысячи солнц!!!"

  • SDP aka Session Description Protocol

  • STUN\TURN + NAT

Основные проблемы, с которыми столкнетесь

  • AAAA "Ярость тысячи солнц!!!"

  • SDP aka Session Description Protocol

  • STUN\TURN + NAT

  • Hardware

Основные проблемы, с которыми столкнетесь

  • AAAA "Ярость тысячи солнц!!!"

  • SDP aka Session Description Protocol

  • STUN\TURN + NAT

  • Hardware

  • Windows не дает 1 микрофон 2 приложениям ...

  • iOS не дает микрофон 2 раза 1 приложению ...

  • Linux не даст вам спать ...

Основные проблемы, с которыми столкнетесь

  • AAAA "Ярость тысячи солнц!!!"

  • SDP aka Session Description Protocol

  • STUN\TURN + NAT

  • Hardware

  • Браузеры. Их слишком много.

The 

The WebRTC 

The WebRTC adapter

The WebRTC adapter

npm install webrtc-adapter

Peer-to-Peer

const pc = new RTCPeerConnection();
await localDescription = pc.createOffer();
await pc.setLocalDescription(localDescription);
ws.send(JSON.stringify(localDescription));
ws.addEventListener('message',(data)=>{
	await pc.setRemoteDescription(JSON.parse(data));
})

Peer-to-Peer

Плюсы

Минусы

Peer-to-Peer

Плюсы

Минусы

  • P2P = End-to-end encryption
  • Практически не нужен сервер 
  • Браузеры договариваются напрямую

Peer-to-Peer

Плюсы

Минусы

  • P2P = End-to-end encryption
  • Практически не нужен сервер 
  • Браузеры договариваются напрямую
  • Нужен STUN
  • 15% звонков не пройдут без TURN
  • Ограниченные функции

STUN | TURN и NAT

STUN | TURN и NAT

NAT

STUN | TURN и NAT

STUN - Simple Traversal of UDP through NATs

stun.l.google.com:19302
stun1.l.google.com:19302
stun2.l.google.com:19302
stun3.l.google.com:19302
stun4.l.google.com:19302

STUN | TURN и NAT

STUN - Simple Traversal of UDP through NATs

STUN | TURN и NAT

STUN - Simple Traversal of UDP through NATs

TURN - Traversal Using Relay NAT

STUN | TURN и NAT

STUN - Simple Traversal of UDP through NATs

TURN - Traversal Using Relay NAT

https://github.com/coturn/coturn

coturn

STUN | TURN и NAT

STUN - Simple Traversal of UDP through NATs

TURN - Traversal Using Relay NAT

https://github.com/coturn/coturn

coturn

P2P и конференция

P2P и конференция

3

3

3

3

P2P и конференция

N-1

N-1

N-1

N-1

Проблемы с CPU и браузерными ресурсами

  • N-1 энкодер видео

  • N-1 декодер видео

1080p

N-1

Проблемы с CPU и браузерными ресурсами

4G

3G

Fiber

N-1

Проблемы с CPU и браузерными ресурсами

4000 KBps

2000 KBps

500 KBps

N-1

Проблемы с CPU и браузерными ресурсами

4000 KBps

2000 KBps

500 KBps

1900 KBps

550 KBps

Общий принцип серверных конференций

Общий принцип серверных конференций

4G

3G

Fiber

Fiber

Управление битрейтом и разрешениями

720p

500 kBps

480p

500 kBps

Управление битрейтом и разрешениями

function limitBitrateBy(maxBitrate){
  const promiseList = [];
  pc.getTransceivers().forEach((tr) => {
    const params = tr.sender.getParameters();
    if (scale != -1) {
      params.encodings[0].maxBitrate = maxBitrate;
    } else {
      delete params.encodings[0].maxBitrate;
    }
    promiseList.push(tr.sender.setParameters(params));
  }
  return Promise.all(promiseList);
}

Управление битрейтом и разрешениями

function scaleDownBy(scale){
  const promiseList = [];
  pc.getTransceivers().forEach((tr) => {
    const params = tr.sender.getParameters();
    if (scale != -1) {
      params.encodings[0].scaleResolutionDownBy = scale;
    } else {
      delete params.encodings[0].scaleResolutionDownBy;
    }
    promiseList.push(tr.sender.setParameters(params));
  }
  return Promise.all(promiseList);
}

Simulcast

Simulcast

Simulcast

Simulcast

Simulcast

const videoTracks = stream.getVideoTracks();
if (videoTracks.length) {
  const initSettings = { direction: 'sendrecv', streams: [stream] };
  if (this._call && this._call.settings.isConference) {
    initSettings.sendEncodings = [
      { rid: 'h', active: true, maxBitrate: 900000 },
      { rid: 'm', active: true, maxBitrate: 300000, scaleResolutionDownBy: 2 },
      { rid: 'l', active: true, maxBitrate: 100000, scaleResolutionDownBy: 4 },
    ];
  }
  videoTracks.forEach((track) => {
    this.impl.addTransceiver(track, initSettings);
  });
}

Simulcast

Плюсы

Минусы

  • Лучше работа с разными сетями
  • Возможность ручного управления потоками

Simulcast

Плюсы

Минусы

  • Лучше работа с разными сетями
  • Возможность ручного управления потоками
  • 2+ энкодера
  • Дополнительный исходящий канал

Управление потоками и лейауты

Управление потоками и лейауты

Управление потоками и лейауты

function updateLayerActivity(enableH,enableM,enableL){
  const promiseList = [];
  pc.getTransceivers().forEach((tr) => {
    const params = tr.sender.getParameters();
    params.encodings[0].active = enableH;
    params.encodings[1].active = enableM;
    params.encodings[2].active = enableL;
    promiseList.push(tr.sender.setParameters(params));
  }
  return Promise.all(promiseList);
}

Renegotiation

Renegotiation

Renegotiation

Perfect negotiation

if (pc.signalingState !== 'stable') {
  Promise.all([
    pc.setLocalDescription({ type: 'rollback' }),
    pc.setRemoteDescription(description),
  ])
    .then(() => this.impl.createAnswer())
    .then((localSession) => {
    	ws.send(JSON.stringify(localSession));
    	pc.setLocalDescription(localSession);
  })
}         

Объем трафика

const fullBitrate = 5000;
pc.getTransceivers().forEach(({ transceiver }) => {
  const params = transceiver.sender.getParameters();
  params.encodings[0].maxBitrate = fullBitrate * 1000;
  transceiver.sender.setParameters(params);
});

VAD и звук на 50+ человек

VAD и звук на 50+ человек

function notifyActive(ev){
    const id = ev.call.id();
    const message = {
        cmd:'srvVAD',
        from:id,
        content:ev.active,
        sessionId: sessionId+""
    }
    ws.send(JSON.stringify(message));
    nLast.update(ev.call.id());
}

call.addEventListener(CallEvents.MicStatusChange,notifyActive)

Хочу видеть не всех

  • Управление видимостью вручную

  • N-last

Хочу видеть не всех

switch (message.event) {
  case "showOnly":
    participant.manageEndpoint({[message.endpoint]:{video:['default']}});
    nLast.removeNlast(participant.id());
    break
  case "showAll":
    participant.manageEndpoint({'all':{video:['default']},'new':{video:['default']}});
    nLast.removeNlast(participant.id());
    break
  case "hideAll":
    participant.manageEndpoint({});
    nLast.removeNlast(participant.id());
    break
  case "nLast":
    nLast.setNlast(participant.id(),participant.manageEndpoint);
    break
}

"Плохой" WebRTC сигналинг

RTCPeerConnection

  • onconnectionstatechange

  • onsignalingstatechange

  • onicecandidate

  • oniceconnectionstatechange 

  • onicegatheringstatechange 

  • onidentityresult 

  • onnegotiationneeded

End to End Encryption

End to End Encryption

https://developers.chrome.com/origintrials/#/view_trial/731834939447705601

WebRTC Insertable Streams

End to End Encryption

WebCodecs

https://developers.chrome.com/origintrials/#/view_trial/-7811493553674125311

End to End Encryption

Demo

https://webrtc.github.io/samples/src/content/peerconnection/endtoend-encryption/

SVC (Scalable Video Coding)

SVC (Scalable Video Coding)

SVC (Scalable Video Coding)

Спасибо!

Вопросы?

Игорь Шеко

Front-end team lead

Voximplant

Video conferencing 2020

By Igor Sheko

Video conferencing 2020

  • 289