WebRTC中OPUS编码相关设置和分析

新版本的WebRTC默认是采用OPUS编码,OPUS编码是silk编码和celt编码的合成,silk编码是skype公司开源的一个编码,
特别适合语音通信,它根据人的声音做了很多优化,但不是适合传输高质量的音乐。celt编码相反更适合传输高质量的音乐。
OPUS编码在采样率很高的情况下,音质还是非常不错的,以下这个连接地址有很多opus的音频样例,大家可以在线听听。
http://www.opus-codec.org/examples/

       根据阅读官方文档知道OPUS编码支持8000,16000,32000,48000等几种编码,支持单声道,双声道,支持6kb-510kb编码率。如果我们想改变WebRTC的声音
编码参数,我们应该如何做呢?
       1.首先我会先去看看WebRTC有没有引出相关的接口,结果查看了PeerConnection,MediaStream,AudioTrack等等相关的类后,根本没有发现相关接口。
       2.根据以往经验,如果WebRTC没有提供直接的接口来调,往往还可以通过修改SDP参数和达到我们的目的。我把生成的Offer SDP打印出来后,发现了比较可疑的地
         方,”fmtp:111 minptime=10;useinbandfec=1″,这一行是设置opus编码参数的地方。我再以“useinbandfec”为关键字在WebRTC中代码中搜索,
       在mediaconstants.cc代码,找到以下相关代码
         // draft-spittka-payload-rtp-opus-03.txt
             const char kCodecParamPTime[] = “ptime”;
             const char kCodecParamMaxPTime[] = “maxptime”;
             const char kCodecParamMinPTime[] = “minptime”;
             const char kCodecParamSPropStereo[] = “sprop-stereo”;
             const char kCodecParamStereo[] = “stereo”;
             const char kCodecParamUseInbandFec[] = “useinbandfec”;
             const char kCodecParamUseDtx[] = “usedtx”;
             const char kCodecParamMaxAverageBitrate[] = “maxaveragebitrate”;
             const char kCodecParamMaxPlaybackRate[] = “maxplaybackrate”;
       3.我依葫芦画瓢,在我自己写的demo代码中把sdp中的”fmtp:111 minptime=10;useinbandfec=1″ 这一行替换成”fmtp:111 minptime=10;useinbandfec=1;maxaveragebitrate =8000″,编译成功运行后,发现参数生效了,发送一路语音占用的带宽由于5K变成了3K左右,这就证明参数生效了。

      4.在网络挺别差的情况下,我们可能希望声音的码流再变小一点,对音质的要求反而不是哪么高了,音频采样率为8000HZ就够了。要实现这个功能的话把”fmtp:111 minptime=10;useinbandfec=1″ 这一行替换成”fmtp:111 minptime=10;useinbandfec=1;maxaveragebitrate =6000;maxplaybackrate=8000″就行了

     5.如果要传音乐,哪我们必需强制OPUS切换到CELT编码。要实现这个功能的话把”fmtp:111 minptime=10;useinbandfec=1″ 这一行替换成”fmtp:111 minptime=10;useinbandfec=1;maxaveragebitrate =64000;maxplaybackrate=48000;stereo=1″就行了

以下功能在WebRTC56版本中试验成功,修改SDP的时机在 SetRemoteDescription 之前,把对方传过来的SDP字符串给替换了,再调用SetRemoteDescription方法

发表评论

电子邮件地址不会被公开。 必填项已用*标注