前言
WebRTC 技术在现代 Web 开发中得到了广泛的应用,而实现 WebRTC 的关键就是处理 Session Description Protocol(SDP)消息。rtc-sdp 就是其中一个比较好用的 npm 包,可用于解析和生成 SDP 消息。本文将从使用需求、安装及使用方法、常见问题等多方面进行介绍。
使用需求
- 熟悉 WebRTC 技术,理解 SDP 消息原理。
- 掌握 npm 包的基本使用方法。
安装
npm i rtc-sdp
使用方法
引入 rtc-sdp 包
const { parse, write } = require('rtc-sdp');
解析 SDP 消息
下面代码演示了如何解析一个 SDP 消息:
const sdpMessage = 'v=0\r\no=- 3819885444593495584 2 IN IP4 127.0.0.1\r\ns=Test\r\nt=0 0\r\na=group:BUNDLE audio video\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 0 8 106 105 13 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:VrIz5cw+SXznJ5lF\r\na=ice-pwd:XEKjWdgJmI66JEULYFazQ0Fo\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 1E:61:0D:D2:3A:......\r\na=setup:actpass\r\na=mid:audio\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=recvonly\r\na=rtpmap:111 opus/48000/2\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:126 telephone-event/8000\r\na=maxptime:60\r\na=ssrc:1329427316 cname:tms6UyzwteO69v52\r\na=ssrc:1329427316 msid:test t0\r\na=ssrc:1329427316 mslabel:test\r\na=ssrc:1329427316 label:test0\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 122 123 124 125\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:VrIz5cw+SXznJ5lF\r\na=ice-pwd:XEKjWdgJmI66JEULYFazQ0Fo\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 1E:61:0D:D2:3A:......\r\na=setup:actpass\r\na=mid:video\r\na=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:3 urn:ietf:params:rtp-hdrext:displayccm\r\na=recvonly\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtcp-fb:96 goog-remb\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtcp-fb:98 goog-remb\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 H264/90000\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=rtcp-fb:100 goog-remb\r\na=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d0028\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:102 H264/90000\r\na=rtcp-fb:102 ccm fir\r\na=rtcp-fb:102 nack\r\na=rtcp-fb:102 nack pli\r\na=rtcp-fb:102 goog-remb\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:122 red/90000\r\na=rtpmap:123 rtx/90000\r\na=fmtp:123 apt=122\r\na=rtpmap:124 ulpfec/90000\r\na=rtpmap:125 FlexFEC/90000\r\na=ssrc-group:FID 3663658589 3140739140\r\na=ssrc:3663658589 cname:tms6UyzwteO69v52\r\na=ssrc:3663658589 msid:test v0\r\na=ssrc:3663658589 mslabel:test\r\na=ssrc:3663658589 label:testv0\r\na=ssrc:3140739140 cname:tms6UyzwteO69v52\r\na=ssrc:3140739140 msid:test v0\r\na=ssrc:3140739140 mslabel:test\r\na=ssrc:3140739140 label:testv0\r\n'; const sdp = parse(sdpMessage); console.log(sdp);
解析后,会得到一个含有音视频相关信息的 JavaScript 对象。
生成 SDP 消息
下面代码演示了如何通过生成 SDP 消息:
-- -------------------- ---- ------- ----- --- - - -------- -- ------- - --------- ---- ---------- ----------------- --------------- -- -------- ----- ------ -- -------- -------------- -- ----- ---------- ------- - ------ -- ----- - -- ----------- ------------ --------- ------------------ ------- ---------------- ------------- - - ----- -------- ----- -------------------------------------------------------------- - -- ------- -- ----- --------- ----- --------- -------- --- ------ - - ----- -------- ----- -- --------- ---------- --------- ----- ---- ---- -- -- ---- ---- --- ----- ---- - - -------- ---- ------ ------- ----- ------ --------- - -- - -------- ---- ------ ------- ----- ----- -- - -------- ---- ------ ------- ----- ----- -- - -------- -- ------ ------- ----- ---- -- - -------- -- ------ ------- ----- ---- -- - -------- ---- ------ ----- ----- ----- -- - -------- ---- ------ ----- ----- ----- -- - -------- --- ------ ----- ----- ---- -- - -------- ---- ------ ------------------ ----- ---- - -- ----------- ------------ --------- ------------------ ------- ---------------- ----------- - -------- -- --- --------- -- ----- - ----- -- -------- ----- ------ -- -------- --------- -- ------ - - --- ----------- ---------- -------- ------ ------------------- -- - --- ----------- ---------- ------- ------ ----- ---- -- - --- ----------- ---------- ---------- ------ ------- -- - --- ----------- ---------- -------- ------ -------- - -- -------------- - - --- -- ---- --------------------------------------------- - -- ----------------- ----- ------- - - ------ -- ---- ---------------------------------------------- ---------- ---------- - -- ---------- ---------- -- - ----- -------- ----- -- --------- ---------- --------- ---- --- --- --- ---- ---- ---- ---- ---- ---- ----- ---- - - -------- --- ------ ------ ----- ----- -- - -------- --- ------ ------ ----- ------ --------- -- -- - -------- --- ------ ------ ----- ----- -- - -------- --- ------ ------ ----- ------ --------- -- -- - -------- ---- ------ ------- ----- ----- -- - -------- ---- ------ ------ ----- ------ --------- --- -- - -------- ---- ------ ------- ----- ----- -- - -------- ---- ------ ------ ----- ----- -- - -------- ---- ------ ------ ----- ------ --------- --- -- - -------- ---- ------ --------- ----- ----- -- - -------- ---- ------ ---------- ----- ----- - -- ----------- ------------ --------- ------------------ ------- ---------------- ----------- - -------- -- --- --------- -- ----- - ----- -- -------- ----- ------ -- -------- --------- -- ------ - - --- ----------- ---------- -------- ------ ------------------- -- - --- ----------- ---------- ------- ------ ----- ---- -- - --- ----------- ---------- ---------- ------ ------- -- - --- ----------- ---------- -------- ------ --------- -- - --- ----------- ---------- -------- ------ ------------------- -- - --- ----------- ---------- ------- ------ ----- ---- -- - --- ----------- ---------- ---------- ------ ------- -- - --- ----------- ---------- -------- ------ --------- - -- -------------- - - --- -- ---- ------------------------------------ -- - --- -- ---- --------------------------------------- - -- ---------- ---------- - - -- ----- ---------- - ----------- ------------------------
应该输出一个字符串,这个字符串就是 SDP 消息。
常见问题
这里列举一些使用 rtc-sdp 时的常见问题。
问题 1:如何给 SDP 中添加指定参数?
使用 rtc-sdp 可以方便地添加 SDP 中的参数。以 rtcp-mux 参数为例,代码如下:
-- -------------------- ---- ------- ----- --- - - ------ - - ----- -------- -------- ----- -- --- - - -- ----- ---------- - -----------
问题 2:SDP 中 ssrc 属性的作用是什么?
Session Description Protocol(SDP)定义了第三方应用程序如何会话有效的完全流动,并提供了编码间多媒体通信所必需的流套路。SSRC 属性是指 Session Description Protocol(SDP)中的 Synchronization Source,其作用是标识同步信源。
问题 3:SDP 中 a=sendonly、a=recvonly 和 a=sendrecv 的含义是什么?
在 WebRTC 中,作为发送端或接收端,需要使用实时通讯模式。因此,我们需要区分是 a=sendonly、a=recvonly,还是 a=sendrecv。
- a=sendonly 表示该媒体流是只发送,不接收的。
- a=recvonly 表示该媒体流是只接收,不发送的。
- a=sendrecv 表示该媒体流是既发送又接收的。
结论
在现代 Web 开发中,WebRTC 技术得到了广泛应用。处理 Session Description Protocol(SDP)消息是实现 WebRTC 的关键之一。rtc-sdp 通过提供解析和生成 SDP 消息的 API,为 WebRTC 技术的开发带来了方便。经过阅读本文,相信大家已经掌握了如何使用 rtc-sdp 包的方法,并且也能够在使用该包时遇到问题时,快速定位解决。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/5f747216a9b7065299ccbc7c