webrtc中APM(AudioProcessing module)的使用

一,實例化和配置git

AudioProcessing* apm = AudioProcessing::Create(0); //這裏的0指的是channelID,只是一個標註那個通道的表示github

apm->level_estimator()->Enable(true);//啓用  重試次數估計   組件
web

apm->echo_cancellation()->Enable(true);//啓用回聲消除組件app

apm->echo_cancellation()->enable_metrics(true);//
測試

apm->echo_cancellation()->enable_drift_compensation(true);//啓用時鐘補償模塊(聲音捕捉設備的時鐘頻率和google

                                                                                                                    播放設備的時鐘頻率可能不同)
spa

apm->gain_control()->Enable(true);//啓用增益控制組件,client必須啓用哦!
.net

apm->high_pass_filter()->Enable(true);//高經過濾器組件,過濾DC偏移和低頻噪音,client必須啓用
code

apm->noise_suppression()->Enable(true);//噪聲抑制組件,client必須啓用
blog

apm->voice_detection()->Enable(true);//啓用語音檢測組件,檢測是否有說話聲

apm->voice_detection()->set_likelihood( VoiceDetection::kModerateLikelihood);//設置語音檢測的閥值,閥值越大,

                                                語音越不容易被忽略,一樣一些噪音可能被當成語音。

apm->Initialize();//保留全部用戶設置的狀況下從新初始化apm的內部狀態,用於開始處理一個新的音頻流。第一個流

                        建立以後不必定須要調用此方法。



二,工做流程

AudioProcessing也是事件驅動的,事件分爲初始化事件、捕捉音頻事件、渲染音頻事件。



初始化事件:

apm->set_sample_rate_hz(sample_rate_hz);//設置本地和遠程音頻流的採樣率。

apm->echo_cancellation()->set_device_sample_rate_hz();//設置音頻設備的採樣率,

咱們假定音頻採集和播放設備採用一樣的採樣率。(drift組件啓用時必須調用)。

 apm->set_num_channels(num_capture_input_channels, num_capture_output_channels);//設置

本地和遠程音頻流的通道數。




播放事件:

apm->AnalyzeReverseStream(&far_frame));//分析遠端音頻流的10ms的frame數據,這些數據爲回聲抑制提供參考。

(啓用回聲抑制的時候須要調用)


捕捉事件:

apm->gain_control()->set_stream_analog_level(capture_level);

apm->set_stream_delay_ms(delay_ms + extra_delay_ms);//設置本地和遠端音頻流之間的延遲,單位毫秒。

這個延遲是遠端音頻流和本地音頻流之間的時差,計算方法爲:

delay = (t_render - t_analyze) + (t_process - t_capture);在調用前記錄便可。

其中

t_analyze是遠端音頻流交給AnalyzeReverseStream()方法的時間;

t_render是與剛纔一樣的遠端音頻frame的播放時間;

elesos注:render-aanalyze感受就是遠端音頻處理的時間,從其開始處理到最終渲染的這一段時間。而

process-capture感受就是近端,從採集到開始處理的這段時間。時差就是雙方的和。


t_capture是本地音頻frame捕捉的時間;

t_process是一樣的本地音頻frame被交給ProcessStream()方法的時間。



 apm->echo_cancellation()->set_stream_drift_samples(drift_samples);//

設置音頻設備捕捉和播放的採樣率的差值。(drift組件啓用時必須調用)


int err = apm->ProcessStream(&near_frame);//處理音頻流,包括各個環節的處理。(如增益調節、回聲消除、噪聲

抑制、語音檢測、高經過率等,沒有解碼哦!是針對pcm數據作處理的)

capture_level = apm->gain_control()->stream_analog_level();//模擬模式下,必須在ProcessStream以後調用此方法,

獲取新的音頻HAL的推薦模擬值。

stream_has_voice =apm->voice_detection()->stream_has_voice();//檢測是否有語音,必須在ProcessStream以後調用

此方法,elesos注:可參考Audio_processing.h

ns_speech_prob = apm->noise_suppression()->speech_probability();//返回內部計算出的當前frame的人聲優先機率。



三,釋放和資源回收

AudioProcessing::Destroy(apm);
apm = NULL;


四,webrtc中自帶例子測試

webrtc工程項目組有個audioproc項目,是測試APM模塊的,不須要指定測試文件和參數,詳情能夠看裏面的--hlep選項。


elesos注:https://code.google.com/p/webrtc-audioproc/  移到

https://github.com/DoubangoTelecom/webrtc-audioproc  (WebRTC AudioProc (AEC, VAD, NS...)



參考:

相關文章
相關標籤/搜索