① 如何正確地在android上計算WebRtc
安卓android 延遲delay webrtc latency aec
WebRtc AECM在Android(三星GT-I9100G),並得到了echo抵消「差不多」,但很難計算好值「msInSndCardBuf」的具有編程。 這里的事情,咱之前已經做了: 使用AudioRecord和AudioTrack來處理實時音頻的東西,echo出現。 包裝WebRtcAecm函數於JNI。 使用WebRtcAecm JNI介面來處理這種echo的東西。咱把它與240毫秒到「msInSndCardBuf」的恆定值工作,但如果延遲由任何原因(螺紋等)變化時的AECM差甚至惡劣的影響。所以,咱想能夠計算出「msInSndCardBuf」編程恆定在240毫秒)。 咱覺得它在audio_procession.h演算法:
delay = (t_render - t_analyze) + (t_process - t_capture)
where:
- t_analyze is the time a frame is passed to AnalyzeReverseStream() and
t_render is the time the first sample of the same frame is rendered by
the audio hardware.
- t_capture is the time the first sample of a frame is captured by the
audio hardware and t_pull is the time the same frame is passed to
ProcessStream().
② 有人用過android 4.1的新API里的AcousticEchoCanceler 回聲消除嗎
下面簡單的備忘下AcousticEchoCanceler的使用方法:
1)判斷當前機型是否支持AEC,需要注意這里的檢查不一定準確。
public static boolean isDeviceSupport()
{
return AcousticEchoCanceler.isAvailable();
}
2)初始化並使能AEC。
private AcousticEchoCanceler canceler;
public boolean initAEC(int audioSession)
{
if (canceler != null)
{
return false;
}
canceler = AcousticEchoCanceler.create(audioSession);
canceler.setEnabled(true);
return canceler.getEnabled();
}
3)使能/去使能AEC。
public boolean setAECEnabled(boolean enable)
{
if (null == canceler)
{
return false;
}
canceler.setEnabled(enable);
return canceler.getEnabled();
}
4)釋放AEC。
public boolean release()
{
if (null == canceler)
{
return false;
}
canceler.setEnabled(false);
canceler.release();
return true;
}
AcousticEchoCanceler的初始化需要一個sessionid,下面簡單的備忘下上層的調用方式:
1)初始化AudioRecord的時候需要處理第一個參數。
if (chkNewDev())
{
audioRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, frequency, channelIN, audioEncoding, tmpSize);
}else
{
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelIN, audioEncoding, tmpSize);
}
2)初始化好audioRecord之後,就可以通過
audioRecord.getAudioSessionId()
獲取到相應的sessionid。
3)初始化AudioTrack時,也需要額外的處理sessionid。
if (chkNewDev() && audioRecord != null)
{
audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, frequency, channelOUT, audioEncoding, tmpSize, AudioTrack.MODE_STREAM,audioRecord.getAudioSessionId());
}
else
{
audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, frequency, channelOUT, audioEncoding, tmpSize, AudioTrack.MODE_STREAM);
}
另外,由於API的限制,需要考慮機型不匹配的情況:
public static boolean chkNewDev()
{
return android.os.Build.VERSION.SDK_INT >= 16;
}
許可權:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
總結:
1)android新版本增加的API AcousticEchoCanceler 可以非常快速的開發出符合VOIP性質的回聲消除程序。但是考慮到各種機型適配,仍然需要第三方的回聲消除程序。這里主要推薦兩個:webrtc裡面的AEC/AECM,speex。
作者成功的在項目中使用了webrtc裡面的回聲消除,感覺效果還可以。
2)作者編寫的上述代碼也只是根據官方的介紹編寫的,由於資料較少,不能保證代碼的正確性。
轉載
③ webrtc ios 噪音怎麼處理
webrtc ios 噪音處理推薦使用ZEGO即構科技。ZEGO即構科技毫秒級音視頻互動,千萬級高並發,70%丟包下仍能保障穩定流暢的觀看體驗。 【點擊免費試用,0成本啟動】
方法/步驟
1 ,右擊桌面右下角的「喇叭」圖標,點擊「錄音設備」。
2 ,這是出現一個「麥克風」設備,右擊「麥克風」,點擊「屬性」。
3 ,「麥克風屬性」在「偵聽」中,找到「偵聽此設備」,若打鉤,把鉤去掉
4 ,再點擊「級別」,把「麥克風加強」調為0.0dB。
可以適度調節麥克風音量。
5 ,在「增強」中,選擇「禁用所有聲音效果」。
6 ,最後再在「高級」中,找到「獨占模式」,在它下邊有兩個選項,全部打鉤。
分別是「允許應用程序獨占控制該設備」「給與獨占模式應用程序優先」。還可以調下「默認格式」。
想要了解更多關於webrtc的相關信息,推薦咨詢ZEGO即構科技。公司自成立伊始,就專注自研音視頻引擎,在音頻前處理、網路自適應和跨平台兼容性等方面,達到國際一流水平,同時充分利用基礎雲服務商的能力,構建了MSDN海量有序自學習數據網路,服務覆蓋全球,涵蓋上百個音視頻互動業務場景。
④ google為什麼要開源webrtc
google開源了WebRTC項目,網址是:http://code.google.com/p/webrtc/。
WebRTC實現了基於網頁的視頻會議,標準是WHATWG 協議,目的是通過瀏覽器提供簡單的javascript就可以達到實時通訊(Real-Time Communications (RTC))能力。
通過對源碼的粗略分析,WebRTC提供了視頻會議的核心技術,包括音視頻的採集、編解碼、網路傳輸、顯示等功能,並且還支持跨平台:windows,linux,mac,android。
WebRTC的視頻處理分析(windows平台)
WebRTC的視頻部分,包含採集、編解碼(I420/VP8)、加密、媒體文件、圖像處理、顯示、網路傳輸與流控(RTP/RTCP)等功能。
視頻採集---video_capture
源代碼在webrtc\moles\video_capture\main目錄下,包含介面和各個平台的源代碼。
在windows平台上,WebRTC採用的是dshow技術,來實現枚舉視頻的設備信息和視頻數據的採集,這意味著可以支持大多數的視頻採集設備;對那些需要單獨驅動程序的視頻採集卡(比如海康高清卡)就無能為力了。
視頻採集支持多種媒體類型,比如I420、YUY2、RGB、UYUY等,並可以進行幀大小和幀率控制。
視頻編解碼---video_coding
源代碼在webrtc\moles\video_coding目錄下。
WebRTC採用I420/VP8編解碼技術。VP8是google收購ON2後的開源實現,並且也用在WebM項目中。VP8能以更少的數據提供更高質量的視頻,特別適合視頻會議這樣的需求。
視頻加密--video_engine_encryption
視頻加密是WebRTC的video_engine一部分,相當於視頻應用層面的功能,給點對點的視頻雙方提供了數據上的安全保證,可以防止在Web上視頻數據的泄漏。
視頻加密在發送端和接收端進行加解密視頻數據,密鑰由視頻雙方協商,代價是會影響視頻數據處理的性能;也可以不使用視頻加密功能,這樣在性能上會好些。
視頻加密的數據源可能是原始的數據流,也可能是編碼後的數據流。估計是編碼後的數據流,這樣加密代價會小一些,需要進一步研究。
視頻媒體文件--media_file
源代碼在webrtc\moles\media_file目錄下。
該功能是可以用本地文件作為視頻源,有點類似虛擬攝像頭的功能;支持的格式有Avi。
另外,WebRTC還可以錄制音視頻到本地文件,比較實用的功能。
視頻圖像處理--video_processing
源代碼在webrtc\moles\video_processing目錄下。
視頻圖像處理針對每一幀的圖像進行處理,包括明暗度檢測、顏色增強、降噪處理等功能,用來提升視頻質量。
視頻顯示--video_render
源代碼在webrtc\moles\video_render目錄下。
在windows平台,WebRTC採用direct3d9和directdraw的方式來顯示視頻,只能這樣,必須這樣。
網路傳輸與流控
對於網路視頻來講,數據的傳輸與控制是核心價值。WebRTC採用的是成熟的RTP/RTCP技術。
WebRTC的音頻處理分析(windows平台)
WebRTC的音頻部分,包含設備、編解碼(iLIBC/iSAC/G722/PCM16/RED/AVT、NetEQ)、加密、聲音文件、聲音處理、聲音輸出、音量控制、音視頻同步、網路傳輸與流控(RTP/RTCP)等功能。
音頻設備---audio_device
源代碼在webrtc\moles\audio_device\main目錄下,包含介面和各個平台的源代碼。
在windows平台上,WebRTC採用的是Windows Core Audio和Windows Wave技術來管理音頻設備,還提供了一個混音管理器。
利用音頻設備,可以實現聲音輸出,音量控制等功能。
音頻編解碼---audio_coding
源代碼在webrtc\moles\audio_coding目錄下。
WebRTC採用iLIBC/iSAC/G722/PCM16/RED/AVT編解碼技術。
WebRTC還提供NetEQ功能---抖動緩沖器及丟包補償模塊,能夠提高音質,並把延遲減至最小。
另外一個核心功能是基於語音會議的混音處理。
聲音加密--voice_engine_encryption
和視頻一樣,WebRTC也提供聲音加密功能。
聲音文件
該功能是可以用本地文件作為音頻源,支持的格式有Pcm和Wav。
同樣,WebRTC也可以錄制音頻到本地文件。
聲音處理--audio_processing
源代碼在webrtc\moles\audio_processing目錄下。
聲音處理針對音頻數據進行處理,包括回聲消除(AEC)、AECM、自動增益(AGC)、降噪處理等功能,用來提升聲音質量。
網路傳輸與流控
和視頻一樣,WebRTC採用的是成熟的RTP/RTCP技術。
WebRTC的官網是http://www.webrtc.org/,其中的FAQ解答了很多大家關心的問題。有這么幾點可以關註:
1.license
採用BSD licenses,可以用於商業軟體;即使你修改了源代碼,也不必公開你修改的部分。
2.為什麼WebRTC要免費
音視頻針對目前的互聯網應用,還是至關重要的。google這樣做的目的,無非是吸引大量的開發者在chrome平台上開發音視頻相關應用,和當年微軟windows集成IE是一個道理。
3.下載和編譯
a).下載google的源碼工具depot_tools:
svn co http://src.chromium.org/svn/trunk/tools/depot_tools
並把depot_tools添加到系統的環境變數PATH里;
b).下載git工具:並把git添加到系統的環境變數PATH里;
c).創建webrtc工作目錄,並在該目錄下運行:
gclient config https://webrtc.googlecode.com/svn/trunk
gclient sync --force
sync命令也會產生基於本地環境(Linux:make, OSX: XCode, Windows: Visual Studio)的build文件。
也可以用命令:
gclient runhooks --force
對windows平台,在trunk目錄下,已經有針對Visual Studio的工程文件:
webrtc.sln
好了,打開它,這就可以編譯了。
註:webrtc默認使用了C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses。我的機器上只有v7.0的sdk,於是構造了一個v7.1的目錄,僅包含Samples\multimedia\directshow\baseclasses。