昨天其实看了一些文章,是偏理论的,今天H5应该要跑通一下,抓包看看实际的消息返回情况,加深理解。
消息都能拿到,和day1的流程图略有出入,不排除版本更新导致的逻辑先后,毕竟网上抄的太多了,还是以实际为准,本人对js不太熟,还是得找个ios app跑一下。
main.js:60 Requesting local stream
main.js:64 Received local stream
main.js:25 Local video videoWidth: 640px, videoHeight: 480px
main.js:82 Starting call
main.js:87 Using video device: FaceTime HD Camera (05ac:8600)
main.js:90 Using audio device: 默认 - Internal Microphone (Built-in)
main.js:93 RTCPeerConnection configuration: {}__proto__: Object
main.js:95 Created local peer connection object pc1
main.js:98 Created remote peer connection object pc2
main.js:105 Added local stream to pc1
main.js:108 pc1 createOffer start
main.js:121 Offer from pc1
v=0
o=- 7030714550138520106 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=msid-semantic: WMS ZnovFGZ4Vb7wCQ8qtFXWpmL1JOLSuHcsQ6cw
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:08Ce
a=ice-pwd:lrEGOZuG1wmuKNl7scmgiBGj
a=ice-options:trickle
a=fingerprint:sha-256 89:47:44:EF:9C:4C:B1:76:57:7F:B5:95:7F:F9:6F:5F:BA:FC:D6:DD:15:02:DF:77:89:EC:75:39:1F:92:A1:9B
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:ZnovFGZ4Vb7wCQ8qtFXWpmL1JOLSuHcsQ6cw c2f5b8e3-b302-4b4f-8154-6aa23f4bbec0
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:3705646631 cname:htuvio4zLhS7lG2b
a=ssrc:3705646631 msid:ZnovFGZ4Vb7wCQ8qtFXWpmL1JOLSuHcsQ6cw c2f5b8e3-b302-4b4f-8154-6aa23f4bbec0
a=ssrc:3705646631 mslabel:ZnovFGZ4Vb7wCQ8qtFXWpmL1JOLSuHcsQ6cw
a=ssrc:3705646631 label:c2f5b8e3-b302-4b4f-8154-6aa23f4bbec0
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 122 127 121 125 107 108 109 124 120 123 119 114 115 116
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:08Ce
a=ice-pwd:lrEGOZuG1wmuKNl7scmgiBGj
a=ice-options:trickle
a=fingerprint:sha-256 89:47:44:EF:9C:4C:B1:76:57:7F:B5:95:7F:F9:6F:5F:BA:FC:D6:DD:15:02:DF:77:89:EC:75:39:1F:92:A1:9B
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://tools.ietf.org/html/draft-ietf-avtext-framemarking-07
a=extmap:9 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:ZnovFGZ4Vb7wCQ8qtFXWpmL1JOLSuHcsQ6cw f6b3e482-d6b0-42e7-b3e9-5269dcee0f1b
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:122 rtx/90000
a=fmtp:122 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:121 rtx/90000
a=fmtp:121 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=4d0032
a=rtpmap:120 rtx/90000
a=fmtp:120 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=640032
a=rtpmap:119 rtx/90000
a=fmtp:119 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 1270934931 396481266
a=ssrc:1270934931 cname:htuvio4zLhS7lG2b
a=ssrc:1270934931 msid:ZnovFGZ4Vb7wCQ8qtFXWpmL1JOLSuHcsQ6cw f6b3e482-d6b0-42e7-b3e9-5269dcee0f1b
a=ssrc:1270934931 mslabel:ZnovFGZ4Vb7wCQ8qtFXWpmL1JOLSuHcsQ6cw
a=ssrc:1270934931 label:f6b3e482-d6b0-42e7-b3e9-5269dcee0f1b
a=ssrc:396481266 cname:htuvio4zLhS7lG2b
a=ssrc:396481266 msid:ZnovFGZ4Vb7wCQ8qtFXWpmL1JOLSuHcsQ6cw f6b3e482-d6b0-42e7-b3e9-5269dcee0f1b
a=ssrc:396481266 mslabel:ZnovFGZ4Vb7wCQ8qtFXWpmL1JOLSuHcsQ6cw
a=ssrc:396481266 label:f6b3e482-d6b0-42e7-b3e9-5269dcee0f1b
main.js:122 pc1 setLocalDescription start
main.js:151 pc1 setLocalDescription complete
main.js:130 pc2 setRemoteDescription start
main.js:165 pc2 received remote stream
main.js:198 pc1 addIceCandidate success
main.js:194 pc1 ICE candidate:
candidate:3804396476 1 udp 2122260223 10.200.0.239 59535 typ host generation 0 ufrag 08Ce network-id 4 network-cost 50
main.js:155 pc2 setRemoteDescription complete
main.js:138 pc2 createAnswer start
main.js:170 Answer from pc2:
v=0
o=- 3301399080753152224 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=msid-semantic: WMS
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:+2Xm
a=ice-pwd:lBd87DJrNbSoLKvfP8SwN3Ah
a=ice-options:trickle
a=fingerprint:sha-256 31:01:09:5F:FB:83:C0:10:D8:47:E8:24:C7:8C:6D:B4:4E:F6:30:C4:E3:BA:78:6E:E6:32:85:54:9F:51:F0:E7
a=setup:active
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=recvonly
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
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 122 127 121 125 107 108 109 124 120 123 119 114 115 116
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:+2Xm
a=ice-pwd:lBd87DJrNbSoLKvfP8SwN3Ah
a=ice-options:trickle
a=fingerprint:sha-256 31:01:09:5F:FB:83:C0:10:D8:47:E8:24:C7:8C:6D:B4:4E:F6:30:C4:E3:BA:78:6E:E6:32:85:54:9F:51:F0:E7
a=setup:active
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://tools.ietf.org/html/draft-ietf-avtext-framemarking-07
a=extmap:9 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=recvonly
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:122 rtx/90000
a=fmtp:122 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:121 rtx/90000
a=fmtp:121 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=4d0032
a=rtpmap:120 rtx/90000
a=fmtp:120 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=640032
a=rtpmap:119 rtx/90000
a=fmtp:119 apt=123
a=rtpmap:114 red/90000
a=rtpmap:115 rtx/90000
a=fmtp:115 apt=114
a=rtpmap:116 ulpfec/90000
main.js:171 pc2 setLocalDescription start
main.js:198 pc1 addIceCandidate success
main.js:194 pc1 ICE candidate:
candidate:2081904996 1 udp 2122194687 169.254.182.9 58066 typ host generation 0 ufrag 08Ce network-id 3
main.js:198 pc1 addIceCandidate success
main.js:194 pc1 ICE candidate:
candidate:3458787597 1 udp 2122131711 240e:e0:a36c:8800:7c3a:1e85:b179:c3ff 58067 typ host generation 0 ufrag 08Ce network-id 2 network-cost 10
main.js:198 pc1 addIceCandidate success
main.js:194 pc1 ICE candidate:
candidate:505434299 1 udp 2122063615 192.168.1.6 56432 typ host generation 0 ufrag 08Ce network-id 1 network-cost 10
main.js:198 pc1 addIceCandidate success
main.js:194 pc1 ICE candidate:
candidate:3804396476 1 udp 2122260223 10.200.0.239 50551 typ host generation 0 ufrag 08Ce network-id 4 network-cost 50
main.js:198 pc1 addIceCandidate success
main.js:194 pc1 ICE candidate:
candidate:2081904996 1 udp 2122194687 169.254.182.9 50793 typ host generation 0 ufrag 08Ce network-id 3
main.js:198 pc1 addIceCandidate success
main.js:194 pc1 ICE candidate:
candidate:3458787597 1 udp 2122131711 240e:e0:a36c:8800:7c3a:1e85:b179:c3ff 50794 typ host generation 0 ufrag 08Ce network-id 2 network-cost 10
main.js:198 pc1 addIceCandidate success
main.js:194 pc1 ICE candidate:
candidate:505434299 1 udp 2122063615 192.168.1.6 57053 typ host generation 0 ufrag 08Ce network-id 1 network-cost 10
main.js:151 pc2 setLocalDescription complete
main.js:178 pc1 setRemoteDescription start
main.js:207 pc1 ICE state: checking
main.js:208 ICE state change event: Event {isTrusted: true, type: "iceconnectionstatechange", target: RTCPeerConnection, currentTarget: RTCPeerConnection, eventPhase: 2, …}
main.js:207 pc2 ICE state: connected
main.js:208 ICE state change event: Event {isTrusted: true, type: "iceconnectionstatechange", target: RTCPeerConnection, currentTarget: RTCPeerConnection, eventPhase: 2, …}
main.js:198 pc2 addIceCandidate success
main.js:194 pc2 ICE candidate:
(null)
main.js:207 pc1 ICE state: connected
main.js:208 ICE state change event: Event {isTrusted: true, type: "iceconnectionstatechange", target: RTCPeerConnection, currentTarget: RTCPeerConnection, eventPhase: 2, …}
main.js:198 pc2 addIceCandidate success
main.js:194 pc2 ICE candidate:
candidate:3804396476 1 udp 2122260223 10.200.0.239 50666 typ host generation 0 ufrag +2Xm network-id 4 network-cost 50
main.js:198 pc2 addIceCandidate success
main.js:194 pc2 ICE candidate:
candidate:2081904996 1 udp 2122194687 169.254.182.9 64067 typ host generation 0 ufrag +2Xm network-id 3
main.js:198 pc2 addIceCandidate success
main.js:194 pc2 ICE candidate:
candidate:3458787597 1 udp 2122131711 240e:e0:a36c:8800:7c3a:1e85:b179:c3ff 64068 typ host generation 0 ufrag +2Xm network-id 2 network-cost 10
main.js:198 pc2 addIceCandidate success
main.js:194 pc2 ICE candidate:
candidate:505434299 1 udp 2122063615 192.168.1.6 51123 typ host generation 0 ufrag +2Xm network-id 1 network-cost 10
main.js:155 pc1 setRemoteDescription complete
main.js:198 pc1 addIceCandidate success
main.js:194 pc1 ICE candidate:
(null)
main.js:33 Remote video size changed to 320x240
main.js:38 Setup time: 180.830ms
main.js:29 Remote video videoWidth: 320px, videoHeight: 240px
main.js:33 Remote video size changed to 320x240
main.js:33 Remote video size changed to 480x360
main.js:33 Remote video size changed to 640x480
main.js:213 Ending callCandidate分为三类,只需要有一类连接成功即可,所以如果通信双方在同一内网,不配置STUN和TURN也可以直接连接。- host: 设备的ipv4或ipv6地址,即内网地址,一般会有两个,分别对应udp和tcp,ip相同,端口不同;
- srflx(server reflexive): STUN返回的外网地址;
- relay: 当STUN不适用时(某些NAT会为每个连接分配不同的端口,导致获取的端口和视频连接端口并不一致),中继服务器的地址;
不用把Candidate收集全了再去告诉对端,解决方案就是IETF提出的Trickle ICE。即发起方每获取一个candidate便立即发送给接收方,这样做的好处在于第一类candidate即host,会立即发送给接收方,这样接收方收到后可以立刻开始收集candidate,也就是发起方和接收方同时进行收集candidate的工作。
另外,接收方每收到一个candidate会立即去检查它的有效性,如果有效直接接通视频,如果无效也不至于浪费时间。那么问题来了,如果第二个连接比第一个连接速度要快,怎么判断?