需求
iOS中使用Audio unit实现音频数据采集,直接采集PCM无损数据, Audio Unit不能直接采集压缩数据,在以后的文章会讲到音频压缩.
实现原理
使用Audio Unit采集硬件输入端,如麦克风,其他外置具备麦克风功能设备(带麦的耳机,话筒等,前提是其本身要和苹果兼容).
阅读前提
本文直接为实战篇,如需了解理论基础参考上述链接中的内容,本文侧重于实战中注意点.
本项目实现低耦合,高内聚,所以直接将相关模块拖入你的项目设置参数就可直接使用.
GitHub地址(附代码) : Audio Unit Capture
简书地址 : Audio Unit Capture
掘金地址 : Audio Unit Capture
博客地址 : Audio Unit Capture
1、具体实现
1.1 代码结构
如上所示,我们总体分为两大类,一个是负责采集的类,一个是负责做音频录制的类,你可以根据需求在适当时机启动,关闭Audio Unit, 并且在Audio Unit已经启动的情况下可以进行音频文件录制,前面需求仅仅需要如下四个API即可完成.
// Start / Stop Audio Queue
[[XDXAudioCaptureManager getInstance] startAudioCapture];
[[XDXAudioCaptureManager getInstance] stopAudioCapture];
// Start / Stop Audio Record
[[XDXAudioQueueCaptureManager getInstance] startRecordFile];
[[XDXAudioQueueCaptureManager getInstance] stopRecordFile];
1.2 初始化audio unit
本例采用单例实现,故将audio unit的实现放在初始化中,仅执行一次,如果销毁了audio unit则需要在外层重新调用初始化API,一般不建议反复销毁创建audio unit,所以最好就是在单例初始化中配置audio unit其后仅仅需要打开关闭即可.
iPhone设备默认仅支持单声道,如果设置双声道代码无法正常初始化. 如果需要模拟双声道,可以手动用代码对单声道数据做一次拷贝.具体方法以后文章会讲到.
注意: 这里的采样buffer大小的设置与采样时间的设置不可随意设置,换句话说,当采样时间一定,我们设置的采样数据大小不能超过其最大值,可通过公式算出采样时间与采样数据的关系.
采样公式计算
数据量(字节 / 秒)=(采样频率(Hz)* 采样位数(bit)* 声道数)/ 8
- (instancetype)init {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instace = [super init];
// Note: audioBufferSize can not more than durationSec max size.
[_instace configureAudioInfoWithDataFormat:&m_audioDataFormat
formatID:kAudioFormatLinearPCM
sampleRate:44100
channelCount:1
audioBufferSize:2048
durationSec:0.02
callBack:AudioCaptureCallback];
});
return _instace;
- (void)configureAudioInfoWithDataFormat:(AudioStreamBasicDescription *)dataFormat formatID:(UInt32)formatID sampleRate:(Float64)sampleRate channelCount:(UInt32)channelCount audioBufferSize:(int)audioBufferS