ios 回声消除,基于Audio Unit

2018.07.26 更新

Audio Unit应用实例:XBVoiceTool

写了一个 Audio Unit 运用的例子,包括录音、播放PCM、播放MP3|AAC、音频数据相加进行混音、用MixUnit混音、根据传入的文件获取混音后的文件(搬运)、AAC编码、MP3编码

2018.03.28 更新

----- 好多同学私信不会用,GitHub项目添加了demo,具体使用参考demo
----- 添加了pcm转WAV的方法(我只是搬运工)


原文

本文Demo: XBEchoCancellation

先说下为什么会有回声。

由于手机app(A端)需要一边录音一边播放声音。A端 在通过麦克风采集输入声音的时候,把手机正在播放的声音(由 B端 传输过来)也采集进去了,并将采集到的声音传到 B端 播放,因此在 B端 听起来除了有 A端 原本想要传的声音,还有 B端 之前传出去的声音(也就是回声)。

我们要将采集到的声音数据中的属于手机播放的那部分声音去除,基于Audio Unit封装了一个工具类,支持回声消除和对pcm数据进行播放。

使用:

获取麦克风输入:

XBEchoCancellation *echo = [XBEchoCancellation shared];
echo.bl_input = ^(AudioBufferList *bufferList) {
    AudioBuffer buffer = bufferList->mBuffers[0];
    // buffer即从麦克风获取到的数据,默认已经消除了回音
};
[echo startInput];

播放pcm音频数据:

XBEchoCancellation *echo = [XBEchoCancellation shared];
echo.bl_output = ^(AudioBufferList *bufferList, UInt32 inNumberFrames) {
    AudioBuffer buffer = bufferList->mBuffers[0];
    // 这里把要传给发声设备的pcm数据赋给buffer
};
[echo startOutput];


种草一波

IOS FFmpeg从零开始编写属于自己的媒体播放器:

IOS FFmpeg零到自己的播放器1,解码
IOS FFmpeg零到自己的播放器2,OpenGL显示图片
IOS FFmpeg零到自己的播放器3,Audio Unit播放PCM音频数据
IOS FFmpeg零到自己的播放器4,架构

推荐阅读更多精彩内容