Audio Unit采集音频实战

需求

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值