前言
iOS下Apple为我们提供了非常方便的音频编解码工具AudioToolbox。该工具中包含了常见的编解码库,如AAC、iLBC、OPUS等。今天我们就介绍一下如何使用 AudioToolbox 进行AAC音频的编码工作。
AAC编码的基本流程
在 iOS 中进行AAC编码的流程比较简单,按以下几步即可完成。
- 设置AAC编器的输入、输出格式。
- 创建AAC编码器。
- 转码。
- 得到AAC编码数据后,增加ADTS头。该头用于区分每个AAC数据帧。
下面我们详细介绍每一步。
设置转码格式
在创建编码器之前,我们首先要设置好编码器的输入数据格式和输出数据格式。比如输入数据是单声道还是双声道,数据是什么格式的,采样率是多少等。同样的,输出参数是AAC,还是OPUS? 每个传输包的大小等。只有这样,AudioToolbox才清楚他要创建一个什么样的编解码器。
当然,这与创建编码器的函数也有关。该函数的前两个输入参数就是音频输入格式和输出格式。函数原型如下:
AudioConverterNewSpecific(
inSourceFormat: AudioStreamBasicDescription, //输入参数
inDestinationFormat: AudioStreamBasicDescription, //输出参数
inNumberClassDescriptions: UInt32, //音频描述符数量
inClassDescriptions: AudioClassDescription, //音频描述符数组
outAudioConverter: AudioConverterRef //编码器
) -> OSStatus
所以,基于以上两个原因,在创建编码器之前一定要先将输入、输出格式设置好。
下面我们来看一下设置输入、输出格式的代码。
AudioStreamBasicDescription inAudioStreamBasicDescription =
*CMAudioFormatDescriptionGetStreamBasicDescription((CMAudioFormatDescriptionRef)
CMSampleBufferGetFormatDescription(sampleBuffer));
上面这段代码就是输入格式的设置。这里用到了一个小技巧,设置编码器的输入格式是通过传入的第一个音频数据包来获得的。因为,在iOS中每个音视频的输入数据中都包含了必要的参数。而iOS也为我们提供了提取这些数据的方法,非常方便。
下面的代码是对编码器输出格式的设置。 注释已经写的非常详细了。
// 先将输出描述符清0
AudioStreamBasicDescription outAudioStreamBasicDescription = {0};
// 设置采样率,有 32K, 44.1K,48K
outAudioStreamBasicDescription.mSampleRate = 44100;
// 音频格式可以设置为 :
// kAudioFormatMPEG4AAC_HE
// kAudioFormatMPEG4AAC_HE_V2
// kAudioFormatMPEG4AAC
outAudioStreamBasicDescription.mFormatID = kAudioFormatMPEG4AAC;
// 指明格式的细节. 设置为 0 说明没有子格式。
// 如果 mFormatID 设置为 kAudioFormatMPEG4AAC_HE 该值应该为0
outAudioStreamBasicDescription.mFormatFlags = kMPEG4Object_AAC_LC;
// 每个音频包的字节数.
// 该字段设置为 0, 表明包里的字节数是变化的。
// 对于使用可变包大小的格式,请使用AudioStreamPacketDescription结构指定每个数据包的大小。
outAudioStreamBasicDescription.mBytesPerPacket = 0;
// 每个音频包帧的数量. 对于未压缩的数据设置为 1.
// 动态码率格式,这个值是一个较大的固定数字,比如说AAC的1024。
// 如果是动态帧数(比如Ogg格式)设置为0。
outAudioStreamBasicDescription.mFramesPerPacket = 1024;
// 每个帧的字节数。对于压缩数据,设置为 0.
outAudioStreamBasicDescription.mBytesPerFrame = 0;
// 音频声道数
outAudioStreamBasicDescription.mChannelsPerFrame = 1;
// 压缩数据,该值设置为0.
outAudioStreamBasicDes