AAC

AAC(Advanced Audio Coding)是一种声音数据的文件压缩格式,分为 ADTS 和 ADIF 两种文件格式。

ADIF 的解码必须从明确的定义位置开始执行,故常用于磁盘文件

ADTS 是具有同步字的比特流,解码可以从流的任意位置开始

因此音频流传输一般采用了 ADTS

ADTS

帧结构与一般帧并无差别
[帧头]+[帧数据]

ADTS 头格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
struct AdtsHeader
{
unsigned int syncword; // 12位,同步字 '1111 1111 1111',一个ADTS帧开始的标志
uint8_t id; // 1位,0代表MPEG-4,1代表MPEG-2
uint8_t layer; // 2位,必须为0
uint8_t protectionAbsent; // 1位,1代表没有CRC,0代表有CRC
uint8_t profile; // 2位,ACC级别(MPEG-2 ACC中定义了3种profile,MPEG-4 ACC中定义了6种)
uint8_t samplingFreqIndex; // 4位,采样率
uint8_t privateBit; // 1位,编码时设置为0,解码时忽略
uint8_t channelCfg; // 3位,声道数量
uint8_t orginalCopy; // 1位,编码时设置为0,解码时忽略
uint8_t home; // 1位,编码时设置为0,解码时忽略

uint8_t copyrightIdentificationStream; // 1位,编码时设置为0,解码时忽略
uint8_t copyrightIdentificationStart; // 1位,编码时设置为0,解码时忽略
unsigned int accFrameLength; // 13位,一个ADTS帧的长度,包括ADTS头和ACC原始流
unsigned int adtsBufferFullness; // 11位,缓冲区充满度,0x7FF说明是码率可变的码流,不需要此字段。CBR可能需要,不同编码器使用情况不同。这个在使用音频编码的时候需要注意。

/*
* number of ACC Frames
* 表示ADTS帧中有numberOfRawDataBlockInFrame + 1个ACC原始帧
* 因此当numberOfRawDataBlockInFrame == 0时
* 表示ADTS帧中有一个ACC数据块(一个AAC原始帧包含一段时间内1024个采样及相关数据)
*/
uint8_t numberOfRawDataBlockInFrame; // 2位

// CRC
};