如何更改 WebRTC 中使用的默认编解码器?

Posted

技术标签:

【中文标题】如何更改 WebRTC 中使用的默认编解码器?【英文标题】:How can I change the default Codec used in WebRTC? 【发布时间】:2015-01-11 12:23:21 【问题描述】:

我一直在谷歌上搜索一种在 Chrome 的 WebRTC 实现中更改编解码器的方法,但似乎没有办法。

如何在 Chrome 中更改 WebRTCpeer 连接中使用的默认编解码器(音频或视频)?

【问题讨论】:

Is there a way to choose codecs in WebRTC PeerConnection?的可能重复 【参考方案1】:

是的,您可以将编解码器更改为您想要的任何内容...只要 Chrome 支持它。目前,音频方面,唯一受支持的编解码器是 PCMA、PCMU、ISAC 和 OPUS(默认)。对于视频,您有 VP8(在某些带有 FireFox 的系统上也有 H264)。

要将这些编解码器中的任何一个用作默认编解码器,您必须先修改您的 SDP,然后才能在对等连接中本地设置它并发送您的提议/答案。我已经测试成功强制 Chrome 默认发送 PCMA 而不是 OPUS。

举个例子:

假设您的默认音频 SDP 部分如下所示(括号中的注释不是 sdp 的一部分)

m=audio<media> 49353<port> RTP/SAVPF<proto> 111 103 104 0 8 106 105 13 126 <rtpformats>

c=IN<nettype> IP4<addrtype> 192.168.0.13<address>

a=rtcp:49353<port> IN<nettype> IP4<addresstype> privateIP<connection address>

a=candidate:1204296370 1 udp 2122260223 privateIP 49353 typ host generation 0 <audioIceCandidate>
a=candidate:1204296370 2 udp 2122260223 privateIP 49353 typ host generation 0
a=candidate:155969090 1 tcp 1518280447 privateIP  0 typ host generation 0
a=candidate:155969090 2 tcp 1518280447 privateIP  0 typ host generation 0
a=ice-ufrag:E7VFzFythTIOaQ6X <ice username>
a=ice-pwd:ZMHFqqXEA8JLjItZcRN4FZDJ <ice-password>
a=ice-options:google-ice <iceoptions>
a=fingerprint:sha-256<encryptType> 66:2D:43:3A:31:7B:46:56:50:D7:CC:75:80:79:5D:88:7D:5D:1B:0E:C7:E6:F9:C4:68:6D:51:7F:4B:32:97:A1<print>
a=setup:actpass <dtls setup mode>
a=mid:audio   
a=extmap:1 urn:ietf:params:rtp-hdrext:s-s-rc-audio-level <extention map>
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=sendrecv <mediamode>
a=rtcp-mux <says rtcp mux>
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
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:126 telephone-event/8000
a=maxptime:60

如果您只想使用 PCMA,您可以将 m=audio 行更改为以下内容: m=audio 49353 RTP/SAVPF 8 这种方式只考虑 PCMA 有效负载。然后,您需要删除所有与该有效负载不对应的 rtpmap 行,即下一个字符不是 8 的任何 a=rtpmap:。如果您在本地设置修改后的 sdp 并将其发送给您的对等方(并且如果他们支持 PCMA ...不必默认为他们,因为协商将强制 PCMA 如果您只提供它),那么 PCMA 将是您的音频编解码器而不是 OPUS。

几句旁白:

我说的SDP就是通过peerconnection的createOffercreateAnswer函数的成功回调生成并传递的SDP 这种想法适用于添加您知道底层系统(H264、SPEEX 等)支持的编解码器。只需确保添加有效负载以及适当的映射和选项(h264 需要fmtp,因为配置文件很重要,可能还有sprop-parameter-sets)。 这将适用于任何适当编码的 WebRTC 系统,即 Firefox、Opera 等。不仅仅是 chrome。

【讨论】:

Chrome 目前根本不支持 H.264,我相信如果底层系统支持 Firefox(我已经看到 Firefox 在其最新版本中提供它作为选项)。 @BenjaminTrent:您能分享一下如何提高 Opus 或 iSac 质量的主要文档吗?请问在哪里可以找到与音频编解码器相关的 SDP 手册? Opus 受动态更改比特率的影响,因此浏览器可能会降低其比特率Here is the rfc referencing the RTP payload format of opus。我链接的那部分应该给出编解码器的选项。将其设为 CBR(恒定比特率)并强制使用相对较高的特定速率可能会有所帮助。 如果您要删除 a=rtpmap 行,还要确保删除相同“编解码器 id”的 a=rtcp-fb 和 a=fmtp 行,否则浏览器可能会抱怨 (例如,如果从 m= 行中删除“8”,则删除 a=rtpmap:8、a=rtcp-fb:8 和 a=fmtp:8 行) @bugwheels94 自从我写那条评论以来,过去 3 年多的时间里事情发生了变化:)。我认为 Chrome 的较新版本在许多系统上都支持 H264,尽管我不知道确切的列表。我在 chrome 65 中测试了 H264,效果很好。回到我写这篇评论的时候,chrome 中的 H264 刚刚开始一个实验阶段,只能通过浏览器设置中的标志访问。

以上是关于如何更改 WebRTC 中使用的默认编解码器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在原生 iOS 应用程序中过滤 WebRTC 编解码器

WebRTC 视频编解码类型的选择 VP8 H264 还是其他?(openh264编码,ffmpeg解码)

WebRTC 视频编解码类型的选择 VP8 H264 还是其他?(openh264编码,ffmpeg解码)

你会在你的WebRTC 应用程序中使用哪种视频编解码器呢?

让 WebRTC 使用外部的音视频编解码器

如何在 Android webRTC 上启用 H264