标贝科技 https://ai.data-baker.com/#/?source=qwer12
填写邀请码fwwqgs,每日免费调用量还可以翻倍
基于AudioQueue实现音频的录制和播放
文章目录
背景
在iOS中常使用AVPlayer
、AVAudioPlayer
来播放在线音乐或者本地音乐,但是支持的格式都是封装好的,比如Mp3,Wav 格式的音频,但是如果需要播放流式的PCM音频数据该怎么办呢? 答案是使用Audio Queue,它也是苹果官方封装的音频处理框架,可以用来播放或录制音频,并且支持平台级音频格式的编码和解码。
AudioQueue 有以下作用
- 连接设备的音频硬件
- 管理音频播放的内存数据
- 协作codec 进行音频的的编解码
- 实现音频的录制和播放
本篇文章主要以PCM 数据为例子进行讲解,讲解音频的录制和实现,文末会附带基于AudioQueue的录音器和播放起的源代码文件;
总览
本篇主要介绍来音频的录制和播放过程,共包含三个部分,Audio Queue 架构、音频的录制、和音频的播放,其中Audio Queue 架构是实现录制和播放的核心,理解了AudioQueue的实现原理,再来看录制和播放将会更加高效率;
Audio Queue 架构
Audio Queue 架包含三个部分: audio queue buffers
, Buffer queue
和 audio queue callback
; audio queue buffers
在结构上是一个数组结构,存储的AudioBuffer数据,下面会专门分析AudioQueueBuffer
的数据结构; Buffer queue
可以理解为管理类,用来管理和组织这些audio queue buffers
按照一定的顺序进行排列和运行, 并且协调audio queue callback
的调用;
AudioQueueBuffer数据结构
下面重点来说明AudioQueueBuffer的数据结构的数据结构如下,主要包含四个部分,其中最核心的是aAduioData
部分。
typedef struct AudioQueueBuffer {
const UInt32 mAudioDataBytesCapacity;
void *const mAudioData;
UInt32 mAudioDataByteSize;
void *mUserData;
} AudioQueueBuffer;
typedef AudioQueueBuffer *AudioQueueBufferRef;
mAudioData
, 它代表要录制和播放的音频数据;
mAudioDataByteSize
: 用来表示audioData
的length
;
mAudioDataBytesCapacity
: 表示一个mAudioData 需要分配的空间,单位是字节(Byte
),它的值必须大于mAudioDataByteSize,否则音频的数据放不下会出现丢失;
mUserData