webrtc SDP和candidate消息生成位置学习

SDP 和candidate消息生成代码

1 ICE消息生成及发送

ICE消息触发是由 webrtc 原生API RTCPeerConnection 中onicecandidate事件传出,在经过rtcpeerconnection做了一定的记录处理,然后触发’ice’事件将ice内容传到Peer 对象中,Peer对象再调用信令服务器接口将candidate消息发送出去。 而onicecandidate事件触发来自 icecandidate事件,而icecandidate 是由RTCPeerConnection API 中setLocalDescription调用内部触发。

在这里插入图片描述

代码流程:
从信令服务器发出的消息:

{
 "to": "NlTiOI7ux4ch-iuHAAGw",
 "sid": "1561345405219",
 "roomType": "video",
 "type": "candidate",
 "payload": {
   "candidate": {
	   "candidate": "candidate:3 1 UDP 92217087 52.83.116.127 64339 typ relay raddr 52.83.116.127 rport 64339",
	   "sdpMid": "0",
	   "sdpMLineIndex": 0
   }
 },
 "prefix": "moz"
}

在Peer.js 中’ice’事假触发处理函数onIceCandidate中的消息:

{
 "candidate": {
   "candidate": "candidate:3 1 UDP 92217087 52.83.116.127 64339 typ relay raddr 52.83.116.127 rport 64339",
   "sdpMid": "0",
   "sdpMLineIndex": 0
 }

WebRTC原生API RTCPeerConnection 中onicecandidate事件传出的消息:

{
 "candidate": "candidate:4 2 TCP 2105524478 192.168.31.195 9 typ host tcptype active",
 "sdpMid": "1",
 "sdpMLineIndex": 1,
 "usernameFragment": null
}

2 SDP 消息生成

2.1 offer 消息生成

当加入房间时SimpleWebrtc会调用webrtc.js中的createPeer函数,而createPeer函数会调用Peer.js构造函数生成peer,之后Peer对象创建成功后,Simplewebrtc.js中会调用Peer.start(),主动调用PeerConnection.prototype.offer,该方法内部会调用原生webrtc RTCPeerConnection API的createOffer 方法,该方法会返回offer内容。经过PeerConnection offer函数一定处理和记录后,触发PeerConnection的’offer’事件处理函数,处理函数中Peer对象再调用信令服务器接口将offer消息发送出去。

在这里插入图片描述

RTCPeerConnection API调用createOffer 生成的消息:

{
  "type": "offer",
  "sdp": "v=0\r\no=mozilla...THIS_IS_SDPARTA-67.0.3 261439577281072343 0 IN IP4 0.0.0.0\r\ns=-\r\nt=0 0\r\na=fingerprint:sha-256 03:91:36:85:CB:CC:2E:23:81:A0:F9:61:B0:83:6D:FC:EF:02:8D:6C:EF:46:FB:39:32:DF:9F:75:7A:1F:36:CA\r\na=group:BUNDLE 0 1 2\r\na=ice-options:trickle\r\na=msid-semantic:WMS *\r\nm=audio 9 UDP/TLS/RTP/SAVPF 109 9 0 8 101\r\nc=IN IP4 0.0.0.0\r\na=sendrecv\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2/recvonly urn:ietf:params:rtp-hdrext:csrc-audio-level\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=fmtp:109 maxplaybackrate=48000;stereo=1;useinbandfec=1\r\na=fmtp:101 0-15\r\na=ice-pwd:565cdc22158330ee56404978e4ca73ec\r\na=ice-ufrag:3c76faca\r\na=mid:0\r\na=msid:{afe1671f-f6df-4034-945f-46f4e5cb29ea} {a2a3fdeb-ecae-4353-8d30-7b88c363d17c}\r\na=rtcp-mux\r\na=rtpmap:109 opus/48000/2\r\na=rtpmap:9 G722/8000/1\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:101 telephone-event/8000/1\r\na=setup:actpass\r\na=ssrc:3803496387 cname:{4a1c315a-f73a-4d42-84a2-963af52d4fd5}\r\nm=video 9 UDP/TLS/RTP/SAVPF 120 121 126 97\r\nc=IN IP4 0.0.0.0\r\na=sendrecv\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:4 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:5 urn:ietf:params:rtp-hdrext:toffset\r\na=fmtp:126 profile-level-id=42e01f;level-asymmetry-allowed=1;packetization-mode=1\r\na=fmtp:97 profile-level-id=42e01f;level-asymmetry-allowed=1\r\na=fmtp:120 max-fs=12288;max-fr=60\r\na=fmtp:121 max-fs=12288;max-fr=60\r\na=ice-pwd:565cdc22158330ee56404978e4ca73ec\r\na=ice-ufrag:3c76faca\r\na=mid:1\r\na=msid:{afe1671f-f6df-4034-945f-46f4e5cb29ea} {73295921-1b57-4e8a-acbc-f1e11e9b8ef7}\r\na=rtcp-fb:120 nack\r\na=rtcp-fb:120 nack pli\r\na=rtcp-fb:120 ccm fir\r\na=rtcp-fb:120 goog-remb\r\na=rtcp-fb:121 nack\r\na=rtcp-fb:121 nack pli\r\na=rtcp-fb:121 ccm fir\r\na=rtcp-fb:121 goog-remb\r\na=rtcp-fb:126 nack\r\na=rtcp-fb:126 nack pli\r\na=rtcp-fb:126 ccm fir\r\na=rtcp-fb:126 goog-remb\r\na=rtcp-fb:97 nack\r\na=rtcp-fb:97 nack pli\r\na=rtcp-fb:97 ccm fir\r\na=rtcp-fb:97 goog-remb\r\na=rtcp-mux\r\na=rtpmap:120 VP8/90000\r\na=rtpmap:121 VP9/90000\r\na=rtpmap:126 H264/90000\r\na=rtpmap:97 H264/90000\r\na=setup:actpass\r\na=ssrc:3573768959 cname:{4a1c315a-f73a-4d42-84a2-963af52d4fd5}\r\nm=application 9 UDP/DTLS/SCTP webrtc-datachannel\r\nc=IN IP4 0.0.0.0\r\na=sendrecv\r\na=ice-pwd:565cdc22158330ee56404978e4ca73ec\r\na=ice-ufrag:3c76faca\r\na=mid:2\r\na=setup:actpass\r\na=sctp-port:5000\r\na=max-message-size:1073741823\r\n"
}

Peer offer事件得到的offer消息内容:

{
  "type": "offer",
  "sdp": "v=0\r\no=mozilla...THIS_IS_SDPARTA-67.0.3 261439577281072343 0 IN IP4 0.0.0.0\r\ns=-\r\nt=0 0\r\na=fingerprint:sha-256 03:91:36:85:CB:CC:2E:23:81:A0:F9:61:B0:83:6D:FC:EF:02:8D:6C:EF:46:FB:39:32:DF:9F:75:7A:1F:36:CA\r\na=group:BUNDLE 0 1 2\r\na=ice-options:trickle\r\na=msid-semantic:WMS *\r\nm=audio 9 UDP/TLS/RTP/SAVPF 109 9 0 8 101\r\nc=IN IP4 0.0.0.0\r\na=sendrecv\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2/recvonly urn:ietf:params:rtp-hdrext:csrc-audio-level\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=fmtp:109 maxplaybackrate=48000;stereo=1;useinbandfec=1\r\na=fmtp:101 0-15\r\na=ice-pwd:565cdc22158330ee56404978e4ca73ec\r\na=ice-ufrag:3c76faca\r\na=mid:0\r\na=msid:{afe1671f-f6df-4034-945f-46f4e5cb29ea} {a2a3fdeb-ecae-4353-8d30-7b88c363d17c}\r\na=rtcp-mux\r\na=rtpmap:109 opus/48000/2\r\na=rtpmap:9 G722/8000/1\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:101 telephone-event/8000/1\r\na=setup:actpass\r\na=ssrc:3803496387 cname:{4a1c315a-f73a-4d42-84a2-963af52d4fd5}\r\nm=video 9 UDP/TLS/RTP/SAVPF 120 121 126 97\r\nc=IN IP4 0.0.0.0\r\na=sendrecv\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:4 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:5 urn:ietf:params:rtp-hdrext:toffset\r\na=fmtp:126 profile-level-id=42e01f;level-asymmetry-allowed=1;packetization-mode=1\r\na=fmtp:97 profile-level-id=42e01f;level-asymmetry-allowed=1\r\na=fmtp:120 max-fs=12288;max-fr=60\r\na=fmtp:121 max-fs=12288;max-fr=60\r\na=ice-pwd:565cdc22158330ee56404978e4ca73ec\r\na=ice-ufrag:3c76faca\r\na=mid:1\r\na=msid:{afe1671f-f6df-4034-945f-46f4e5cb29ea} {73295921-1b57-4e8a-acbc-f1e11e9b8ef7}\r\na=rtcp-fb:120 nack\r\na=rtcp-fb:120 nack pli\r\na=rtcp-fb:120 ccm fir\r\na=rtcp-fb:120 goog-remb\r\na=rtcp-fb:121 nack\r\na=rtcp-fb:121 nack pli\r\na=rtcp-fb:121 ccm fir\r\na=rtcp-fb:121 goog-remb\r\na=rtcp-fb:126 nack\r\na=rtcp-fb:126 nack pli\r\na=rtcp-fb:126 ccm fir\r\na=rtcp-fb:126 goog-remb\r\na=rtcp-fb:97 nack\r\na=rtcp-fb:97 nack pli\r\na=rtcp-fb:97 ccm fir\r\na=rtcp-fb:97 goog-remb\r\na=rtcp-mux\r\na=rtpmap:120 VP8/90000\r\na=rtpmap:121 VP9/90000\r\na=rtpmap:126 H264/90000\r\na=rtpmap:97 H264/90000\r\na=setup:actpass\r\na=ssrc:3573768959 cname:{4a1c315a-f73a-4d42-84a2-963af52d4fd5}\r\nm=application 9 UDP/DTLS/SCTP webrtc-datachannel\r\nc=IN IP4 0.0.0.0\r\na=sendrecv\r\na=ice-pwd:565cdc22158330ee56404978e4ca73ec\r\na=ice-ufrag:3c76faca\r\na=mid:2\r\na=setup:actpass\r\na=sctp-port:5000\r\na=max-message-size:1073741823\r\n"
}

信令服务器发送的offer消息内容:

{
  "to": "3zURHX3sn6O3cwdyAAHE",
  "sid": "1561354977852",
  "roomType": "video",
  "type": "offer",
  "payload": {
    "type": "offer",
    "sdp": "v=0\r\no=mozilla...THIS_IS_SDPARTA-67.0.3 261439577281072343 0 IN IP4 0.0.0.0\r\ns=-\r\nt=0 0\r\na=fingerprint:sha-256 03:91:36:85:CB:CC:2E:23:81:A0:F9:61:B0:83:6D:FC:EF:02:8D:6C:EF:46:FB:39:32:DF:9F:75:7A:1F:36:CA\r\na=group:BUNDLE 0 1 2\r\na=ice-options:trickle\r\na=msid-semantic:WMS *\r\nm=audio 9 UDP/TLS/RTP/SAVPF 109 9 0 8 101\r\nc=IN IP4 0.0.0.0\r\na=sendrecv\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2/recvonly urn:ietf:params:rtp-hdrext:csrc-audio-level\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=fmtp:109 maxplaybackrate=48000;stereo=1;useinbandfec=1\r\na=fmtp:101 0-15\r\na=ice-pwd:565cdc22158330ee56404978e4ca73ec\r\na=ice-ufrag:3c76faca\r\na=mid:0\r\na=msid:{afe1671f-f6df-4034-945f-46f4e5cb29ea} {a2a3fdeb-ecae-4353-8d30-7b88c363d17c}\r\na=rtcp-mux\r\na=rtpmap:109 opus/48000/2\r\na=rtpmap:9 G722/8000/1\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:101 telephone-event/8000/1\r\na=setup:actpass\r\na=ssrc:3803496387 cname:{4a1c315a-f73a-4d42-84a2-963af52d4fd5}\r\nm=video 9 UDP/TLS/RTP/SAVPF 120 121 126 97\r\nc=IN IP4 0.0.0.0\r\na=sendrecv\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:4 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:5 urn:ietf:params:rtp-hdrext:toffset\r\na=fmtp:126 profile-level-id=42e01f;level-asymmetry-allowed=1;packetization-mode=1\r\na=fmtp:97 profile-level-id=42e01f;level-asymmetry-allowed=1\r\na=fmtp:120 max-fs=12288;max-fr=60\r\na=fmtp:121 max-fs=12288;max-fr=60\r\na=ice-pwd:565cdc22158330ee56404978e4ca73ec\r\na=ice-ufrag:3c76faca\r\na=mid:1\r\na=msid:{afe1671f-f6df-4034-945f-46f4e5cb29ea} {73295921-1b57-4e8a-acbc-f1e11e9b8ef7}\r\na=rtcp-fb:120 nack\r\na=rtcp-fb:120 nack pli\r\na=rtcp-fb:120 ccm fir\r\na=rtcp-fb:120 goog-remb\r\na=rtcp-fb:121 nack\r\na=rtcp-fb:121 nack pli\r\na=rtcp-fb:121 ccm fir\r\na=rtcp-fb:121 goog-remb\r\na=rtcp-fb:126 nack\r\na=rtcp-fb:126 nack pli\r\na=rtcp-fb:126 ccm fir\r\na=rtcp-fb:126 goog-remb\r\na=rtcp-fb:97 nack\r\na=rtcp-fb:97 nack pli\r\na=rtcp-fb:97 ccm fir\r\na=rtcp-fb:97 goog-remb\r\na=rtcp-mux\r\na=rtpmap:120 VP8/90000\r\na=rtpmap:121 VP9/90000\r\na=rtpmap:126 H264/90000\r\na=rtpmap:97 H264/90000\r\na=setup:actpass\r\na=ssrc:3573768959 cname:{4a1c315a-f73a-4d42-84a2-963af52d4fd5}\r\nm=application 9 UDP/DTLS/SCTP webrtc-datachannel\r\nc=IN IP4 0.0.0.0\r\na=sendrecv\r\na=ice-pwd:565cdc22158330ee56404978e4ca73ec\r\na=ice-ufrag:3c76faca\r\na=mid:2\r\na=setup:actpass\r\na=sctp-port:5000\r\na=max-message-size:1073741823\r\n"
  },
  "prefix": "moz"
}

2.2 answer 消息生成

当收到对端offer消息后,调用了PeerConnection的handleOffer处理函数,之后就主动调用PeerConnection.answer方法。该方法又会调用 PeerConnection._answer的方法,在该方法中会调用webrtc原生RTCPeerConnection API createAnswer的方法返回answer。经过_answer记录处理后,会触发answer事件,answer事件会调用服务发送answer消息。

this.pc.on(‘answer’, function (answer) {

RTCPeerConnection.createAnswer(function (answer) {}); 原生API生成answer消息

{
  "type": "answer",
  "sdp": "v=0\r\no=mozilla...THIS_IS_SDPARTA-67.0.3 3557134043810194619 0 IN IP4 0.0.0.0\r\ns=-\r\nt=0 0\r\na=fingerprint:sha-256 E2:0D:A0:EA:85:5C:83:88:2C:2F:41:3A:95:AF:2E:A0:1B:3D:D2:7A:D9:32:B9:7B:13:96:A3:B6:A2:63:01:1E\r\na=group:BUNDLE 0 1 2\r\na=ice-options:trickle\r\na=msid-semantic:WMS *\r\nm=audio 9 UDP/TLS/RTP/SAVPF 109 101\r\nc=IN IP4 0.0.0.0\r\na=sendrecv\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=fmtp:109 maxplaybackrate=48000;stereo=1;useinbandfec=1\r\na=fmtp:101 0-15\r\na=ice-pwd:504f8779fd0f8e253dcf6377a6f496eb\r\na=ice-ufrag:295f820c\r\na=mid:0\r\na=msid:{25dbfb30-b6ec-4abd-ad3a-2a3e58d85897} {cb921919-eb11-4481-9dd2-6f78515a8d5c}\r\na=rtcp-mux\r\na=rtpmap:109 opus/48000/2\r\na=rtpmap:101 telephone-event/8000/1\r\na=setup:active\r\na=ssrc:4009002643 cname:{fec7121f-924b-4648-8ecf-d4c02893b97a}\r\nm=video 9 UDP/TLS/RTP/SAVPF 120\r\nc=IN IP4 0.0.0.0\r\na=sendrecv\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:4 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:5 urn:ietf:params:rtp-hdrext:toffset\r\na=fmtp:120 max-fs=12288;max-fr=60\r\na=ice-pwd:504f8779fd0f8e253dcf6377a6f496eb\r\na=ice-ufrag:295f820c\r\na=mid:1\r\na=msid:{25dbfb30-b6ec-4abd-ad3a-2a3e58d85897} {a9e142ed-ca52-4cac-ab25-e2c33742acad}\r\na=rtcp-fb:120 nack\r\na=rtcp-fb:120 nack pli\r\na=rtcp-fb:120 ccm fir\r\na=rtcp-fb:120 goog-remb\r\na=rtcp-mux\r\na=rtpmap:120 VP8/90000\r\na=setup:active\r\na=ssrc:1773632207 cname:{fec7121f-924b-4648-8ecf-d4c02893b97a}\r\nm=application 9 UDP/DTLS/SCTP webrtc-datachannel\r\nc=IN IP4 0.0.0.0\r\na=sendrecv\r\na=ice-pwd:504f8779fd0f8e253dcf6377a6f496eb\r\na=ice-ufrag:295f820c\r\na=mid:2\r\na=setup:active\r\na=sctp-port:5000\r\na=max-message-size:1073741823\r\n"
}

PeerConnection.on(‘answer’, function (answer)) answer事件得到的消息

{
  "type": "answer",
  "sdp": "v=0\r\no=mozilla...THIS_IS_SDPARTA-67.0.3 3557134043810194619 0 IN IP4 0.0.0.0\r\ns=-\r\nt=0 0\r\na=fingerprint:sha-256 E2:0D:A0:EA:85:5C:83:88:2C:2F:41:3A:95:AF:2E:A0:1B:3D:D2:7A:D9:32:B9:7B:13:96:A3:B6:A2:63:01:1E\r\na=group:BUNDLE 0 1 2\r\na=ice-options:trickle\r\na=msid-semantic:WMS *\r\nm=audio 9 UDP/TLS/RTP/SAVPF 109 101\r\nc=IN IP4 0.0.0.0\r\na=sendrecv\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=fmtp:109 maxplaybackrate=48000;stereo=1;useinbandfec=1\r\na=fmtp:101 0-15\r\na=ice-pwd:504f8779fd0f8e253dcf6377a6f496eb\r\na=ice-ufrag:295f820c\r\na=mid:0\r\na=msid:{25dbfb30-b6ec-4abd-ad3a-2a3e58d85897} {cb921919-eb11-4481-9dd2-6f78515a8d5c}\r\na=rtcp-mux\r\na=rtpmap:109 opus/48000/2\r\na=rtpmap:101 telephone-event/8000/1\r\na=setup:active\r\na=ssrc:4009002643 cname:{fec7121f-924b-4648-8ecf-d4c02893b97a}\r\nm=video 9 UDP/TLS/RTP/SAVPF 120\r\nc=IN IP4 0.0.0.0\r\na=sendrecv\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:4 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:5 urn:ietf:params:rtp-hdrext:toffset\r\na=fmtp:120 max-fs=12288;max-fr=60\r\na=ice-pwd:504f8779fd0f8e253dcf6377a6f496eb\r\na=ice-ufrag:295f820c\r\na=mid:1\r\na=msid:{25dbfb30-b6ec-4abd-ad3a-2a3e58d85897} {a9e142ed-ca52-4cac-ab25-e2c33742acad}\r\na=rtcp-fb:120 nack\r\na=rtcp-fb:120 nack pli\r\na=rtcp-fb:120 ccm fir\r\na=rtcp-fb:120 goog-remb\r\na=rtcp-mux\r\na=rtpmap:120 VP8/90000\r\na=setup:active\r\na=ssrc:1773632207 cname:{fec7121f-924b-4648-8ecf-d4c02893b97a}\r\nm=application 9 UDP/DTLS/SCTP webrtc-datachannel\r\nc=IN IP4 0.0.0.0\r\na=sendrecv\r\na=ice-pwd:504f8779fd0f8e253dcf6377a6f496eb\r\na=ice-ufrag:295f820c\r\na=mid:2\r\na=setup:active\r\na=sctp-port:5000\r\na=max-message-size:1073741823\r\n"
}

Peer.send消息

{
  "to": "MqzgsXAE2vz_KsewAAAc",
  "sid": "1561364748196",
  "roomType": "video",
  "type": "answer",
  "payload": {
    "type": "answer",
    "sdp": "v=0\r\no=mozilla...THIS_IS_SDPARTA-67.0.3 3557134043810194619 0 IN IP4 0.0.0.0\r\ns=-\r\nt=0 0\r\na=fingerprint:sha-256 E2:0D:A0:EA:85:5C:83:88:2C:2F:41:3A:95:AF:2E:A0:1B:3D:D2:7A:D9:32:B9:7B:13:96:A3:B6:A2:63:01:1E\r\na=group:BUNDLE 0 1 2\r\na=ice-options:trickle\r\na=msid-semantic:WMS *\r\nm=audio 9 UDP/TLS/RTP/SAVPF 109 101\r\nc=IN IP4 0.0.0.0\r\na=sendrecv\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=fmtp:109 maxplaybackrate=48000;stereo=1;useinbandfec=1\r\na=fmtp:101 0-15\r\na=ice-pwd:504f8779fd0f8e253dcf6377a6f496eb\r\na=ice-ufrag:295f820c\r\na=mid:0\r\na=msid:{25dbfb30-b6ec-4abd-ad3a-2a3e58d85897} {cb921919-eb11-4481-9dd2-6f78515a8d5c}\r\na=rtcp-mux\r\na=rtpmap:109 opus/48000/2\r\na=rtpmap:101 telephone-event/8000/1\r\na=setup:active\r\na=ssrc:4009002643 cname:{fec7121f-924b-4648-8ecf-d4c02893b97a}\r\nm=video 9 UDP/TLS/RTP/SAVPF 120\r\nc=IN IP4 0.0.0.0\r\na=sendrecv\r\na=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:4 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:5 urn:ietf:params:rtp-hdrext:toffset\r\na=fmtp:120 max-fs=12288;max-fr=60\r\na=ice-pwd:504f8779fd0f8e253dcf6377a6f496eb\r\na=ice-ufrag:295f820c\r\na=mid:1\r\na=msid:{25dbfb30-b6ec-4abd-ad3a-2a3e58d85897} {a9e142ed-ca52-4cac-ab25-e2c33742acad}\r\na=rtcp-fb:120 nack\r\na=rtcp-fb:120 nack pli\r\na=rtcp-fb:120 ccm fir\r\na=rtcp-fb:120 goog-remb\r\na=rtcp-mux\r\na=rtpmap:120 VP8/90000\r\na=setup:active\r\na=ssrc:1773632207 cname:{fec7121f-924b-4648-8ecf-d4c02893b97a}\r\nm=application 9 UDP/DTLS/SCTP webrtc-datachannel\r\nc=IN IP4 0.0.0.0\r\na=sendrecv\r\na=ice-pwd:504f8779fd0f8e253dcf6377a6f496eb\r\na=ice-ufrag:295f820c\r\na=mid:2\r\na=setup:active\r\na=sctp-port:5000\r\na=max-message-size:1073741823\r\n"
  },
  "prefix": "moz"
}

2.3 endofcandidate消息格式

Object { to: "5tWeTFq2ia5Kc-SkAACO", sid: "1562227999900", roomType: "video", type: "endOfCandidates", prefix: "moz", from: "kUauGLcA9UpG0f7TAACQ" }

Pion WebRTC提供了一种方便的方式来修改SDP(Session Description Protocol),以实现对媒体协商的控制。下面是一些修改SDP的方法: 1. 修改SDP中的音频和视频编码:通过修改SDP中的"m="行可以更改音频和视频的编码协议、传输协议和端口号。例如,你可以使用"opus"代替"PCMU"来更改音频编码。 2. 修改SDP中的带宽限制:通过修改SDP中的"b="行可以更改媒体流的带宽限制。例如,你可以将音频流的带宽限制从128kbps降低到64kbps。 3. 修改SDP中的ICE候选地址:通过修改SDP中的"a=candidate"行可以更改ICE候选地址。例如,你可以将ICE候选地址从IPv4更改为IPv6。 4. 修改SDP中的DTLS加密参数:通过修改SDP中的"a=setup"和"a=fingerprint"行可以更改DTLS加密参数。例如,你可以将DTLS加密模式从"actpass"更改为"active"。 5. 修改SDP中的会话属性:通过修改SDP中的"a=group"和"a=mid"行可以更改会话属性。例如,你可以将音频流和视频流分别分组并分配唯一的ID。 要修改SDP,你可以使用以下代码片段作为参考: ``` // 获取本地SDP offer := webrtc.SessionDescription{} err = json.Unmarshal([]byte(sdp), &offer) if err != nil { fmt.Println(err) return } // 修改SDP offer.SDP = strings.Replace(offer.SDP, "PCMU", "opus", -1) offer.SDP = strings.Replace(offer.SDP, "a=mid:0", "a=mid:audio", -1) offer.SDP = strings.Replace(offer.SDP, "a=mid:1", "a=mid:video", -1) // 创建应答 answer, err := peerConnection.CreateAnswer(nil) if err != nil { fmt.Println(err) return } // 设置本地SDP err = peerConnection.SetLocalDescription(answer) if err != nil { fmt.Println(err) return } // 发送应答SDP给远端 sendSDP(answer) ``` 这段代码将本地SDP中的"PCMU"替换为"opus",并将音频流和视频流分别分配唯一的ID。请根据你的具体应用场景进行修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值