AudioEffect

AudioEffect这个类现在支持当捕获到音频时额外的的音频预处理类型:

作为声学回声消除器(AEC)的AcousticEchoCanceler这个类消除了从远程捕捉到音频信号上的信号的作用。

作为自动增益控制(AGC)的AutomaticGainControl这个类自动恢复正常捕获的信号输出。

作为噪声抑制器的(NS)的NoiseSuppressor这个类可以消除被捕获信号的背景噪音。

您可以应用这些利用AudioEffect一个子类的AudioRecord类上的音频捕获预处理效果。

注意:并不能保证所有的设备都能支持这些效果的,所以你应该首先调用在对应音频效果类上的isAvailable()的方法来检测它的可用性。

 

Android在4.1(API level 16)的时候增加了一个API:AcousticEchoCanceler

官方对此的介绍:【 http://developer.android.com/reference/android/media/audiofx/AcousticEchoCanceler.html 】

AcousticEchoCanceler 继承自【 AudioEffect 】

 

 

  • 1 下面简单的备忘下AcousticEchoCanceler的使用方法:
  • 2 AcousticEchoCanceler的初始化需要一个sessionid,下面简单的备忘下上层的调用方式:
  • 3 总结:

下面简单的备忘下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)作者编写的上述代码也只是根据官方的介绍编写的,由于资料较少,不能保证代码的正确性。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值