iOS原生的录音API大致有Audio Queue Service、Audio Unit、Audio Engine以及AVFoundation中的AVCaptureDevice和AVAudioRecoder这么几类,其中Audio Engine是对Audio Unit的封装。从官方文档的图developer.apple.com/library/arc… 中可以看出,他们都属于应用层,其中Audio unit和Audio Queue Service是最古老的,也属于相对底层的API,而Audio Engine和AVFoundation相对上层一点。
从笔者的使用经历来看,可以从这几个方面对他们进行比较:
1. 易用性
AVFondation和Audio Engine是直接用OC和swift写的API,而Audio Queue Service、Audio Unit是C写的,对于iOS开发者来说肯定是前两者更好用。对于一般的音频采集和播放来说用这两者就够的。这里AVFondation的流式采集主要用 AVCaptureDevice(包含音频、视频和静态图片采集),播放使用AVPlayer,数据源使用AVAsset。如果需求比较简单,对采样率没有特殊要求(默认是44.1KHz),用AVFondation就够了。但如果需要特定的采样率,就需要更换其他API(例如Audio Engine)或者对音频进行重采样了。重采样可以使用AudioConverter(编解码同样也是使用这个类)或者ffmpeg,因为不涉及采集,就不在这里详细说了。对于写入到文件这种非流式采集,用AVCaptureDevice或者AVAudioRecoder都可以,相对来说AVAudioRecoder使用更简单。
Audio Unit跟Audio Queue Service使用流程,都是设置好采集的参数和回调函数,需要注意的是Audio Unit的输入输出参数设置初看起来有点不太好理解,比如音频采集设置的是InputScope的outputBus,而音频播放设置的是outputScope的inputBus。相对来说Audio Queue Service更好理解一点。但是Audio Queue Service也有跟AVCaptureDevice一样的毛病,只支持默认的采样率。而Audio Unit则强大许多,不但支持不同的采样率,还有回声消除、混音、滤波(过滤特定频率的声音)等功能,但需要结合AUGraph使用。
因此从易用性角度上来看,AVFondation> Audio Engine> Audio Queue Service>Audio unit
2. 功能覆盖面
前面说到,Audio Queue Service和AVCaptureDevice只能使用默认采样率,尽管你可以在AVAudioSession里设置preferedSampleRate,但据我实测是没有效果的,至少16K、8Khz都没有效果。而Audio Unit则可以录制16K、8Khz的音频,Audio Engine 作为对Audio Unit的封装,理论上也支持16K、8K,但实际操作下来发现installTap时会如下的报错,原因应该还是框架内做了限制,而改为48KHz之后就没有这个错误了。笔者测试的是iPhone13 iOS17.2的系统,从报错的信息看猜测这个限制跟硬件有关
required condition is false: IsFormatSampleRateAndChannelCountValid(hwFormat)
required condition is false: format.sampleRate == hwFormat.sampleRate
对于样本大小、通道数这些参数而言,这几个框架都可以正常设置,因此没有区别。
从功能覆盖面的角度上来看,Audio Unit> Audio Engine>Audio Queue Service/AVFondation
3. 兼容性
笔者测试过iphone6s iOS13 和iphone13 iOS 16/17 两个手机,使用Audio Unit同时进行录音和播放,发现在iphone13 iOS 16/17 这个手机上表现很好,但在iphone6s iOS13这个手机上就没有声音了(经查明是ios13 上audiosession的category没有设置导致,ios17默认设置了),感觉兼容性是有点问题的。如果只录音不播放的话,两个手机倒也正常。我也试过其他框架,Audio Engine和Audio Queue Service在两个手机上都是可以同时录音和播放,AVFondation还没试过,估计也不会太差。
我也试过使用Audio Unit录音的同时使用Audio Queue Service播放,发现录音没问题,但是播放没声音,不知道是哪里不兼容。换成用Audio Engine录音的话,则Audio Queue Service可以正常播放。
因此从兼容性的角度来看, Audio Engine/Audio Queue Service>Audio Unit
由于测试的机型和系统有限,可能结论有失偏颇,欢迎各位看官指正。