WebRTC中的Opus編碼揭秘


WebRTC中默認是采用Opus編碼,Opus編碼是由silk編碼和celt編碼合並在一起,silk編碼是由skype公司開源的一種語音編碼,特別適合人聲,適合於Voip語音通信。celt和mp3,aac類似,適合於傳輸音樂。Opus編碼具備以下特點:

  1. 6 kb /秒到510 kb / s的比特率
  2. 采樣率從8 kHz(窄帶)到48 kHz(全頻)
  3. 幀大小從2.5毫秒到60毫秒
  4. 支持恆定比特率(CBR)和可變比特率(VBR)
  5. 從窄帶到全頻段的音頻帶寬
  6. 支持語音和音樂
  7. 支持單聲道和立體聲
  8. 支持多達255個頻道(多數據流的幀)
  9. 可動態調節比特率,音頻帶寬和幀大小
  10. 良好的魯棒性丟失率和數據包丟失隱藏(PLC)
  11. 浮點和定點實現

WebRTC中要使用Opus編碼,首先在SDP中要有以下定義:

a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1

以上的WebRTC產生的默認配置,這種配置下,音頻采樣率是48000,音頻打包時間是10ms,單聲道,編碼采用的是Opus里面的silk編碼,適合傳人聲,不適合傳音樂。下面我們分別就如何修改采樣率,如何修改聲道數,如何修改碼流做詳細介紹。

修改采樣率
Opus支持8000,12000,16000,24000,48000 這幾種采樣率,比如我們現在如果要設置音頻采樣率為8000,我們應該如何做呢?把SDP修改成如下格式就可以支持8000采樣率:

a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc 前面兩行基本上不會動
a=fmtp:111 minptime=10;useinbandfec=1;maxplaybackrate=8000; 

  不管我們現在采樣率要設置為多少,sdp中的前面兩行基本上是不會動的。根據抓包分析發現,即使我們現在把采樣率修改為8000,音頻Rtp中的時間戳還是以960遞增。960是在48000采樣率情況下20ms聲音的信號數。

WebRTC中還支持通信雙方以非對稱采樣率工作。比如A和B通話,A的采樣率為48000,B的采樣率為8000。當雙方采樣率不一樣時,WebRTC應該如何處理呢?舉個例子:

A-----------------> B OfferSDP

a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc 
a=fmtp:111 minptime=10;useinbandfec=1;maxplaybackrate=16000

B------------------->A AnswerSDP

a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc 
a=fmtp:111 minptime=10;useinbandfec=1;maxplaybackrate=48000

A用戶的采樣率為B用戶返回的AnswerSDP中的maxplaybackrate,這里是48000,所以A用戶音頻采樣為48000,

同理B用戶的采樣率為16000

聲道數

在a=ftmp這一行中加入stereo=1代表雙聲道,stereo=0代表單聲道,雙聲道一般用來傳音樂,從WebRTC代碼中可以發現,當我們設置聲道數為2時,opus編碼內部將使用celt,代碼如下:

config.application = config.num_channels == 1 ? AudioEncoderOpus::kVoip : AudioEncoderOpus::kAudio;

kVoip適合於語音通話,kAudio適合於傳輸音樂。

碼流
在a=ftmp這一行中加入maxaveragebitrate代表接收方能接受的最大碼流,單位為bit。比如maxaveragebitrate=64000代表碼流為64kbps

開啟DTX
DTX 是 Discontinuous Transmission的簡稱,這個特性是在用戶不說話時不傳輸語音,這樣可以節省點帶寬。默認WebRTC是不開啟這個特性的,要開啟DTX,只需要在a=ftmp這一行中加入usedtx=1就行

轉自: https://www.jianshu.com/p/090cbdf98a96


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM