WebRTC由語音引擎,視頻引擎和網絡傳輸三大模塊組成,其中語音引擎是WebRTC中最具價值的技術之一。
WebRTC語音引擎由一系列音頻和網絡處理模塊組成,包括了從音頻採集到網絡傳輸等處理流程的完整解決方案。
語音引擎工作流程圖
語音引擎的一般工作流程如下:
1.發起端進行聲音採集
2.採集到的聲音信號進行回聲消除,噪音抑制,自動增益控制處理
3.語音壓縮編碼
4.通過Internet網路傳輸到接收端
5.到達接收端,先進入NetEQ模塊進行抖動消除,丟包隱藏解碼等操作
6.將處理過後的音頻數據送入聲卡設備進行播放
NetEQ模塊是Webrtc語音引擎中的核心模塊
NetEQ模塊框圖
從上圖看,NetEQ模塊基本上分爲:自適應緩衝器(Adaptive Packet Buffer),語音解碼器(Speech Decoder),抖動控制和丟包隱藏(Jitter Control and Error Concealment) 以及播放(Play Out)四大部分。其中抖動控制和丟包隱藏模塊是NetEQ的核心算法,既控制着自適應緩衝器,又與解碼器進行緊密的交互,並且將最終的計算結果交給聲卡去播放。
WebRTC的語音引擎在運行時會啓動兩個線程:一個線程用於接收來自於網絡的數據包,並將其插入到抖動緩衝區中;另外一個線程每隔10ms從NetEQ中提取10ms語音數據進行播放。
網絡數據包進入抖動緩衝區的過程在:
int32_t ACMNetEQ::RecIn(const uint8_t* incoming_payload, const int32_t length_payload, const WebRtcRTPHeader& rtp_info, uint32_t receive_timestamp)
提取10ms語音數據到聲卡的過程在:
int32_t ACMNetEQ::RecOut(AudioFrame& audio_frame)