音视频开发系列(25)iOS下 AAC 音频编码

 

前言

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值