如何更改 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的createOffer
和createAnswer
函数的成功回调生成并传递的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 中使用的默认编解码器?的主要内容,如果未能解决你的问题,请参考以下文章
WebRTC 视频编解码类型的选择 VP8 H264 还是其他?(openh264编码,ffmpeg解码)