① 如何正确地在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。