webrtc原碼分析

2021-07-03 06:51:06 字數 3015 閱讀 3644

本文介紹webrtc音訊模組組成和結構,詳細介紹音訊引擎的配置和啟動,相信看完本文後,很多人可以利用webrtc完成乙個音訊通話程式開發。

一、對外介面

音訊部分的對外主要介面如下,各個介面之間的關係如圖1所示。

1)voiceengine:負責引擎的所有介面查詢,儲存共享資料資訊sharedata。

2)voebase:負責音訊處理的基本操作。

3)voeaudioprocessing:音訊訊號處理介面,設定各個音訊處理項的引數。

4)voecodec:音訊編譯碼介面,提供支援的編解碼器查詢,音訊編譯碼設定。

5)voehardware:音訊硬體裝置介面,負責音訊硬體裝置的設定。

其它的介面還有voeneteqstats,voenetwork,voertp_rtcp,voevideosync,voevolumecontrol,voefile,voecallreport,voedtmf,voemeidaprocess和voeencryption。

webrtc使用繼承實現介面轉換和查詢,介面之間的資料共享是通過sharedata完成,首先voiceengineimpl繼承各個對外介面的實現,所以可以從voiceengineimpl很容易獲取其他對外介面。而voiceengineimpl本身也繼承sharedata,當從voiceengineimpl獲取其他對外介面的同時,隱式的傳遞了sharedata指標,因此各個介面可以很方便的獲取到sharedata的資料資訊。因此雖然類與類之間的關係看起來比較混亂,但是使用上比較方便。

利用voiceengine獲取對外介面:voeinte***cexx* pinterf = voeinte***cexx:getinte***ce(pvoiceengine);

圖(1)介面關係示意圖

二、模組組成

圖(2)模組組成和關係示意圖

主要由五大模組組成:audiodevicemodule音訊裝置模組,audioprocess音訊處理模組,audiocodingmodule音訊編碼模組,audioconferencemixer混音模組和rtprtcp傳輸模組。

sharedata用於粘合各個模組之間的關係,負責管理全域性的物件,包括audiodevicemodule,transmitmixer,outputmixer,channelmanager和audioprocess。

錄音流程:audiodevicewincore負責採集音訊資料,傳遞到audiodevicebuffer中快取,audiodevicebuffer則將資料送入transmixmixer,首先交給audioprocess進行近端音訊處理,完成後分發到各個channel中,channel則通過audiocodingmodule進行編碼,編碼後再交付到rtprtcp中經由rtpsender傳送出去。

接收流程:rtpreceiver負責接收音訊rtp包,接收到rtp包後交給channel,channel轉交給audiocodingmodule中的acmneteq模組,進行解碼快取。

三、配置

1、音訊引擎建立與刪除

voiceengine*pvoeengine = voiceengine::create();

voiceengine::delete(pvoeengine);

2、音訊收發

1)音訊通話鏈路建立

webrtc中的channel,為一路音訊。作為網路語音通訊,至少要建立一路音訊channel。

channel沒有提供對外介面,是有voebase來管理的,通過索引號來選定對應的channel。

voebase*base = voebase::getinte***ce(pvoeengine);

int ch0 =base->createchannel();

2)網路埠設定

音訊通過rtp和rtcp傳送出去,rtp和rtcp使用udp實現,需要配置網路埠和位址。

//設定傳送給.2機器的3000埠

base->setsenddestination(ch0,3000,」192.168.8.2」);

//在本機的3000埠接收rtp包

base->setlocalreceiver(ch0,3000);

3)音訊編碼選擇

voecodec負責編譯碼的配置。

voecodec*codec = voebase::getinte***ce(pvoeengine);

設定channel的編碼型別之前,要查詢支援的編碼列表。

codecinstinst;

intnum = codec->numofcodecs();

for(int i=0; i

//設定編碼0

codec->getcodec(0,inst);

codec->setsendcodec(ch0,inst);

webrtc自動識別編碼型別,因此解碼不需要設定。

4)啟動

啟動接收:base->startreceive(ch0);開始接收後,每增加一路通話,引擎會將音訊進行混音再輸出。

啟動傳送:base->startsend(ch0);啟動傳送的時候,會檢查是否正在錄音,如果已經開啟錄音,則不再開啟;否則會執行音訊裝置錄音操作。

3、音訊處理的配置

voeaudioprocessing負責音訊處理的配置。

voeaudioprocessing*paudioproc = voeaudioprocessing::getinte***ce(pvoeengine);

//啟動agc功能

paudioproc->setagcstatus(true);

4、音訊裝置的配置

voehardware*phardware=voeaudioprocessing::getinte***ce(pvoeengine);

int numin =phardware->getnumofrecordingdevices();

for(int i=0;i

//選擇裝置0作為錄音裝置

phardware->setrecordingdevice(0);

webRTC協議分析

http hyper text transport protocol 超文字傳輸協議 應用層協議 包括 sip websocket 和 xmpp websocket 子協議 nat 會話穿透實用工具 回話建立之前會傳送stun報文進行測試 確定是否位於nat之後並發現對映位址和埠 這些資訊用於構建i...

WebRTC原始碼分析

注 webrtc的版本是m75 已完成 正在寫作中 webrtc原始碼分析之多路訊號分離器 physicalsocketserver webrtc原始碼分析之訊息佇列 messagequeue webrtc原始碼分析之執行緒 thread webrtc原始碼分析之跨執行緒同步執行 methodcal...

webrtc研究 remb協議分析

分析入口 webrtc ideo vie remb.cc void vieremb onreceivebitratechanged const std vector ssrcs,uint32 t bitrate bitrate bitrate calculate total receive bitr...