0%

AAC 编解码器

编码规格

  • AAC LC:Low Complexity。低复杂度规格,码流是 128k,音质好。主要应用于中高编码率的场景编码(>= 80Kbit/s)。

  • AAC HE V1:AAC LC + SBR(Spectral Band Replication)。其核心思想是按频谱保存,低频编码保存主要部分,高频单独放大编码保存音质。码流在 64k 左右。主要应用于低码率的编码(<= 48Kbit/s)

  • AAC HE V2:AAC LC + SBR + PS(Parametric Stereo)。其核心思想是双声道中的声音存在某种相似度,只需存储一个声道的全部信息,然后,花很少的字节用参数描述另一个声道和它不同的地方。

一般码流越大,其保真度越高。码流越小,压缩比高,去除的冗余信息就多,其就会对声音造成一定的损失。

编码格式

ADIF(Audio Data Interchange Format)

可以确定地找到这个音频数据的开始,相当于 AAC 数据加上数据头。只能从头开始解码,不能在音频数据流中间开始。应用于磁盘文件。

ADTS(Audio Data Transport Stream)

每一帧都有一个同步字,所以可以在音频流的任意位置开始解码。会比 ADIF 的数据大。应用于流媒体。

ADTS 结构

ADTS由7或9个字节组成,但其字段排列是按照位来排列。以下每段(即图的一行)是一个字节(8位),每个字母表示一位(0/1),每四位可用一个十六进制表示。

二进制表示:

1
AAAAAAAA AAAABCCD EEFFFFGH HHIJKLMM MMMMMMMM MMMOOOOO OOOOOOPP (QQQQQQQQ QQQQQQQQ)

Header consists of 7 or 9 bytes (without or with CRC).

Letter Length (bits) Description
A 12 syncword 0xFFF, all bits must be 1
同步字,表示这是个 ADTS 数据,都为1。
B 1 MPEG Version: 0 for MPEG-4, 1 for MPEG-2
使用的编码规范。
C 2 Layer: always 0
D 1 protection absent, Warning, set to 1 if there is no CRC and 0 if there is CRC
决定是7位还是9位。
E 2 profile, the MPEG-4 Audio Object Type minus 1 使用的编码规格↑。
F 4 MPEG-4 Sampling Frequency Index (15 is forbidden)
采样率
G 1 private bit, guaranteed never to be used by MPEG, set to 0 when encoding, ignore when decoding
H 3 MPEG-4 Channel Configuration (in the case of 0, the channel configuration is sent via an inband PCE)
I 1 originality, set to 0 when encoding, ignore when decoding
J 1 home, set to 0 when encoding, ignore when decoding
K 1 copyrighted id bit, the next bit of a centrally registered copyright identifier, set to 0 when encoding, ignore when decoding
L 1 copyright id start, signals that this frame's copyright id bit is the first bit of the copyright id, set to 0 when encoding, ignore when decoding
M 13 frame length, this value must include 7 or 9 bytes of header length: FrameLength = (ProtectionAbsent == 1 ? 7 : 9) + size(AACFrame)
O 11 Buffer fullness
P 2 Number of AAC frames (RDBs) in ADTS frame minus 1, for maximum compatibility always use 1 AAC frame per ADTS frame
Q 16 CRC if protection absent is 0

这些值一般不是具体的数值,而是一个约定的编号,根据编号获得其对应具体数值。

可以根据该工具,输入对应的 ADTS 头,就可以解析出具体的含义。

可见,找到一个同步字0xFFF即找到一个ADTS的开头。

欢迎关注我的其它发布渠道