WebRTC原始碼分析二 音訊模組結構

2021-06-20 12:42:41 字數 3180 閱讀 6247

本文介紹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; icodec->getcodec(i,inst);

//列印編碼資訊

//設定編碼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;iphardware->getrecordingdevicenames(…)

//列印錄音裝置

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

phardware->setrecordingdevice(0);

WebRTC原始碼分析 音訊模組結構分析

一 概要介紹webrtc的音訊處理流程,見下圖 webrtc將音訊會話抽象為乙個通道channel,譬如a與b進行音訊通話,則a需要建立乙個channel與b進行音訊資料傳輸。上圖中有三個channel,每個channel包含編譯碼和rtp rtcp傳送功能。1 錄音執行緒 負責麥克風音訊的採集,見...

WebRTC原始碼分析

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

WebRTC原始碼分析之RTP RTCP(一)

首先學習一下rtp rtcp的基礎知識。rtp報頭 當上面csrc計數器 cc 等於0時上面一共12位元組,當大於0時有以下csrc列表 貢獻源列表 csrc list 0 15項,每項32位元,用來標誌對乙個rtp混合器產生的新包有貢獻的所有rtp包的源。由混合器將這些有貢獻的ssrc識別符號插入...