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方法
相關文章
相關標籤/搜索