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

AudioEffect相关推荐

  1. [Android] AudioEffect架构:从上层调用到底层音效驱动

    一上层的API说明 二JNI以及配置文件相关文件 三交互 四音效驱动 五分析AudioEffect架构的意图 六代码以及控制说明 本篇文章,只研究架构,不谈具体音效的实现算法. 一,上层的API说明 ...

  2. 什么是AudioEffect

    这段时间接手 Android 音频子系统,相应 Framework 层的内容也让我在负责.这其中有一个叫 AudioEffect 的概念一直很困扰我,因为我之前一直是在底层开发转悠的,接触的都是 HA ...

  3. AudioEffect源码解析

     音效AudioEffect 如下图,应用程序开发者使用android.media.audiofx.AudioEffect来控制音效,它的子类包括:BassBoost, Environmental ...

  4. AudioEffect与Equalizer解析(Java侧)

    ##AudioEffect Android2.3增加了对音频混响的支持,通过AudioEffect可以方便地对AudioTrack和MediaPlayer播放的音乐进行音效控制.AudioEffect ...

  5. Android源码分析:AudioEffect

    如下图,应用程序开发者使用android.media.audiofx.AudioEffect来控制音效,它的子类包括:BassBoost, EnvironmentalReverb, Equalizer ...

  6. 关于AudioEffect使用过程中的构造以及处理流程遇到的几个问题

    最近遇到几个与AudioEffect相关的问题,在此记录下作为一个记忆总结 android系统中如果想使用自己开发或者第三方的音效算法,有一种比较简单的办法就是放到hal层的out_write接口中, ...

  7. Android API AudioEffect中文API与应用实例

    在Android2.3中增加了对音频混响的支持,这些API包含在android.media.audiofx包中. 一.概述 AudioEffect是android audio framework(an ...

  8. Android AudioEffect音效移植

    原文链接:https://blog.csdn.net/wkw1125/article/details/65632960 AudioEffect构造流程跟踪 为了编写新的音效实现,需要了解Android ...

  9. Cocos2d-x Eclipse下程序运行产生错误Effect initCheck() returned -1

    错误大致显示如下信息: 04-14 07:39:18.325: E/AudioEffect(20584): set(): AudioFlinger could not create effect, s ...

最新文章

  1. 怎样理解公钥,私钥和数字签名
  2. 各种语言下 static 详解
  3. 搜索推荐炼丹笔记:CVR预估中的延迟反馈问题
  4. CentOS7防火墙firewalld和iptable的设置和使用
  5. PAT1052 卖个萌 (20 分)【别人的代码 借鉴从字符串中截取特定部分的思路】
  6. Linux下C程序进程地址空间布局
  7. codeigniter + Ajax (亲测)
  8. 项目部署,环境搭建(pip/ makefile)
  9. 计算机硬盘扇区修复,一文教你搞定硬盘上的坏扇区要怎么修复,如果从坏扇区修复数据!...
  10. 应该根据哪些判断云服务器的好坏
  11. C++ Reference: Standard C++ Library reference: C Library: cfenv: FE_DOWNWARD
  12. 我的世界服务器如何做无限箱子,《我的世界》无限存储箱子制作方法 制作流程介绍...
  13. JRebel安装、使用
  14. 从小白的角度理解二项分布、几何分布和泊松分布
  15. SMS发送WapPush
  16. JDK1.8之Lambada表达式一
  17. ReentrantLock源码走读分析
  18. C语言结构体error: invalid use of incomplet type ‘ struct people’
  19. 工业智能网关在物联网系统中扮演什么角色?
  20. nginx禁用ip访问配置

热门文章

  1. Cesium Billboard加载Gif图片
  2. 足球报:青岛中能提出仲裁申请,希望撤销扣分处罚_虎扑中国足球新闻
  3. C++ 多线程: WaitForSingleObject(m_hEvent,INFINITE) ;
  4. linux查看mysql用户权限_教您如何查看MySQL用户权限
  5. MySQL数据库查看用户命令
  6. jquery效果 显示隐藏 滑入滑出
  7. 【BUUCTF】[极客大挑战 2019]RCE ME
  8. 2015-2016年最佳年会小品剧本,绝对爆笑,台本
  9. 咳嗽比较厉害,除了吃药,还有什么建议
  10. 数字图像处理 matlab实现