前言
视频直播,K歌应用等等都会有音频录制的功能,音频录制时还可以带有耳返效果,那这些是如何实现的呢?如果仅仅是录制音频,那使用IOS的AudioQueue框架实现即可,但是在直播这些实时性要求比较高、特效比较多(比如混音,变声等)的应用中,AudioQueue可能满足不了要求了,AudioUnit可以完成这些功能。
本文将介绍用AudioUnit完成音频采集,耳返效果,保存裸PCM音频文件
AudioUnit音频系列
AudioUnit之-播放裸PCM音频文件(一)
AudioUnit之-录制音频+耳返(二)
AudioUnit之-录制音频保存为m4a/CAF/WAV文件和播放m4a/CAF/WAV文件(三)
AudioUnit之-录制音频并添加背景音乐(四)
AudioUnit之-generic output(离线)混合音频文件(五)
实现思路
先看一张图片,该图片来自官方关于AudioUnit Augraph的说明文档中,官网文档
IO_unit_2x.png
1、图解
这里的Remote I/O Unit代表了扬声器和麦克风硬件,其中Element0代表了扬声器,Element1代表了麦克风。Element0(扬声器)的Input scope连接着app端,Output scope连接着扬声器硬解,Element1(麦克风)的Input scope连接着麦克风硬件端,Output scope连接着app端。
2、播放音频过程
系统定时从播放缓冲区(该缓冲区对app不可见)中读取音频数据输送给扬声器硬件,扬声器进行播放,所以只要app不停的往该播放缓冲区中输送音频数据(即通过Element0的Input scope输送数据),保证该缓冲区中有音频数据,那么音频将持续播放,至于用AudioUnit播放PCM音频的代码可参考前面的文章AudioUnit播放PCM音频
3、采集过程
采集过程则是播放过程的逆过程,麦克风不停的采集数据放入采集缓冲区(该缓冲区对app不可见),所以只要app不停的从该采集缓冲区中读取音频数据(即通过Element1的Out scope获取数据),那么即可完成音频的采集过程,该音频数据为裸PCM音频数据,你可以直接保存到文件中,也可以用aac编码后保存到m4a文件中,也可以直接发送到网络中等等。
4、耳返实现
所谓耳返,就是录制的音频实时输送回扬声器进行播放。有了前面2