写点什么

音视频八股文(7)-- 音频 aac adts

  • 2023-04-27
    北京
  • 本文字数:4408 字

    阅读完需:约 14 分钟

AAC 介绍

AAC(Advanced Audio Coding)是一种现代的音频编码技术,用于数字音频的传输和存储领域。AAC 是 MPEG-2 和 MPEG-4 标准中的一部分,可提供更高质量的音频数据,并且相比于 MP3 等旧有音频格式,AAC 需要更少的比特率。


AAC 通过使用一些高级的音频编码算法来实现更好的声音质量和更低的压缩比。其中最重要的算法是信号掩蔽技术、短时频谱分析和 Psychoacoustic 模型。这些算法使得 AAC 能够在较低的比特率下保持更好的音质,并且减少了由于压缩而引入的失真和噪音。


AAC 支持多种采样率、声道数和比特率,以满足不同应用场景的需求。它可以实现从 8 kbps 到 320 kbps 的不同比特率的音频压缩,同时实现 CD 音质甚至更高的音乐体验。


AAC 还具有很好的灵活性和可扩展性,包括高级音频编码(High Efficiency AAC,HE-AAC)、带有 SBR 的 HE-AAC v2 和 LC-AAC(Low Complexity AAC)等变体。此外,AAC 还支持与其他多媒体技术(如 H.264 或 MPEG-4)集成使用,并且支持多种容器格式(如 MP4、3GP、M4A 和 ADTS 等)。


总之,AAC 是一种现代的音频编码技术,具有高质量的音频数据、较低的比特率、灵活性和可扩展性等优点。由于其广泛应用于数字音频传输和存储领域,它已经成为音频压缩领域的标准之一。

AAC ADTS 介绍

AAC(Advanced Audio Coding)是一种现代的音频编码技术,被广泛应用于数字音频传输和存储领域。AAC 可以提供更高质量的音频数据,同时相比 MP3 等旧有音频格式,AAC 需要更少的比特率。


ADTS(Audio Data Transport Stream)是 AAC 音频流的容器格式,它是一种通过网络传输音频流的标准格式之一。ADTS 文件包含了 AAC 音频流中的各个元素,并且在音频数据中添加了额外的信息,如同步标记、采样率、通道数等。


ADTS 文件由多个部分组成,其中最重要的是头部信息。头部信息通常占据了整个文件中的前 7 到 9 个字节,其中包括了一个固定的同步标记(syncword),该标记用于确定音频帧的边界位置。进一步的,头部还包含了一些 AAC 音频流的基础信息,如声道数、采样率、比特率和编码配置等。


在 ADTS 文件中,每个 AAC 音频帧都以一个长度为 7 或 9 个字节的 ADTS 帧头开始,其中包含了同步标记、帧大小、采样率、声道数和其他元数据。接下来是 AAC 编码的原始音频数据,这些数据会被添加到 ADTS 帧中,以形成完整的音频帧。


总之,ADTS 是 AAC 音频流的容器格式,提供了一种便捷的方式来传输和存储 AAC 音频流。通过 ADTS,可以轻松地对 AAC 音频进行封装和解封,以满足各种应用场景的需求。

AAC ADTS Header 介绍

AAC ADTS(Audio Data Transport Stream)文件是 AAC 音频流的一种容器格式,其中最重要的部分之一就是 ADTS 头部信息。ADTS 头部信息占据了整个文件中的前 7 或 9 个字节,其中包括了一个固定的同步标记(syncword),该标记用于确定音频帧的边界位置。以下是对 ADTS 头部信息中各个字段的详细介绍:


  1. 同步字(syncword):2 个字节(16 位)同步字是 ADTS 文件的标志符,它用于确定音频帧的开始位置和结束位置,通常为 0xFFF。

  2. ID (MPEG Version):1 个字节(8 位)ID 指示使用的 MPEG 版本。值为 0 表示 MPEG-4,值为 1 表示 MPEG-2。

  3. Layer:2 个比特 Layer 定义了音频流所属的层级,对于 AAC 来说,其值为 0。

  4. Protection Absent:1 个比特 Protection Absent 指示是否启用 CRC 错误校验。当该比特为 0 时,表明音频数据经过 CRC 校验,否则未经过 CRC 校验。

  5. Profile:2 个比特 Profile 指示编码所使用的 AAC 规范类型,如 AAC LC、AAC HE-AAC 等。

  6. Sampling Frequency Index (Sampling Rate):4 个比特 Sampling Frequency Index 表示采样率的索引,它告诉解码器当前音频数据的采样率。这个值的范围是 0 到 15,每个值表示一个特定的采样率。

  7. Private Bit:1 个比特 Private Bit 为私有比特,通常被设置为 0,没有实际作用。

  8. Channel Configuration:3 个比特 Channel Configuration 指示音频的通道数,如单声道、立体声或多声道等。

  9. Originality:1 个比特 Originality 指示编码数据是否被原始产生,通常为 0。

  10. Home:1 个比特 Home bit 通常被设置为 0,没有实际作用。

  11. Emphasis:2 个比特 Emphasis 指示对信号进行强调处理的类型,一般不使用。


除了上述字段之外,ADTS 头部还包括文件长度和帧长度等信息。其中,文件长度指整个 AAC ADTS 文件的长度,而帧长度则指当前 ADTS 帧所占的字节数。这些信息可以通过解析 ADTS 头部来确定音频帧的边界,从而提取出原始的 AAC 音频数据。


总之,AAC ADTS 头部信息包括同步字、ID、Layer、Protection Absent、Profile、Sampling Frequency Index、Private Bit、Channel Configuration、Originality、Home、Emphasis 等各个字段,通过这些字段可以读取 AAC 音频流中的基础信息,并确定音频帧的边界位置。

AAC ES 介绍

AAC ES(AAC Elementary Stream)是 AAC 音频编码的一种基本数据格式,也是 AAC 音频数据在流式传输和文件存储中的常见格式之一。


AAC ES 不同于其他容器格式(如 MP4、M4A 等),它不包含额外的元数据或结构信息,仅包含未经任何封装或压缩处理的原始音频数据。这些原始数据可以作为音频文件或流传输的基础,同时也可以用于对 AAC 音频进行转码、编辑或重组。


AAC ES 通常由一系列连续的 AAC 音频帧组成,每个帧以一个特定的标志符开始,该标志符表示这是一个 AAC 音频帧。在 AAC ES 中,每个音频帧拥有相同的长度,但是并不一定包含相同数量的采样点,因为采样率和声道数量可能会发生变化。


AAC ES 的另一个关键特征是其比特流顺序,即数字音频数据的组织方式。AAC ES 采用大端字节顺序,其中高位字节排在前面,低位字节排在后面。此外,在 AAC ES 中,音频数据按照从左到右、自上而下的顺序排列,与典型的文本文件不同。


总之,AAC ES 是 AAC 音频编码的一种基本数据格式,它通常由一系列 AAC 音频帧组成,并且不包含任何附加的元数据或结构信息。AAC ES 可以作为音频文件或流传输的基础,同时也可以用于对 AAC 音频进行转码、编辑或重组。由于其简单性和灵活性,AAC ES 受到了广泛的应用,并且成为了数字音频编码领域的标准之一。

AAC ADTS 格式分析

AAC⾳频格式:Advanced Audio Coding(⾼级⾳频解码),是⼀种由 MPEG-4 标准定义的有损⾳频压缩格式,由 Fraunhofer 发展,Dolby, Sony 和 AT&T 是主要的贡献者。


ADIF:Audio Data Interchange Format ⾳频数据交换格式。这种格式的特征是可以确定的找到这个⾳频数据的开始,不需进⾏在⾳频数据流中间开始的解码,即它的解码必须在明确定义的开始处进⾏。故这种格式常⽤在磁盘⽂件中。


ADTS 的全称是 Audio Data Transport Stream。是 AAC⾳频的传输流格式。AAC⾳频格式在 MPEG-2(ISO-13318-7 2003)中有定义。AAC 后来⼜被采⽤到 MPEG-4 标准中。这种格式的特征是它是⼀个有同步字的⽐特流,解码可以在这个流中任何位置开始。它的特征类似于 mp3 数据流格式。


简单说,ADTS 可以在任意帧解码,也就是说它每⼀帧都有头信息。ADIF 只有⼀个统⼀的头,所以必须得到所有的数据后解码。


且这两种的 header 的格式也是不同的,⽬前⼀般编码后的和抽取出的都是 ADTS 格式的⾳频流。两者具体的组织结构如下所示:


AAC 的 ADIF 格式⻅下图:



AAC 的 ADTS 的⼀般格式⻅下图:



空⽩处表示前后帧


有的时候当你编码 AAC 裸流的时候,会遇到写出来的 AAC⽂件并不能在 PC 和⼿机上播放,很⼤的可能就是 AAC⽂件的每⼀帧⾥缺少了 ADTS 头信息⽂件的包装拼接。


只需要加⼊头⽂件 ADTS 即可。⼀个 AAC 原始数据块⻓度是可变的,对原始帧加上 ADTS 头进⾏ADTS 的封装,就形成了 ADTS 帧。


AAC⾳频⽂件的每⼀帧由 ADTS Header 和 AAC Audio Data 组成。结构体如下:



每⼀帧的 ADTS 的头⽂件都包含了⾳频的采样率,声道,帧⻓度等信息,这样解码器才能解析读取。


⼀般情况下 ADTS 的头信息都是 7 个字节,分为 2 部分:


adts_fixed_header();adts_variable_header();


其⼀为固定头信息,紧接着是可变头信息。固定头信息中的数据每⼀帧都相同,⽽可变头信息则在帧与帧之间可变。



syncword :同步头 总是 0xFFF, all bits must be 1,代表着⼀个 ADTS 帧的开始


ID:MPEG 标识符,0 标识 MPEG-4,1 标识 MPEG-2


Layer:always: '00'


protection_absent:表示是否误码校验。Warning, set to 1 if there is no CRC and 0 if there is CRC


profile:表示使⽤哪个级别的 AAC,如 01 Low Complexity(LC)--- AAC LC。有些芯⽚只⽀持 AAC LC 。


在 MPEG-2 AAC 中定义了 3 种:



profile 的值等于 Audio Object Type 的值减 1


profile = MPEG-4 Audio Object Type - 1




sampling_frequency_index:表示使⽤的采样率下标,通过这个下标在 Sampling Frequencies[ ]数组中查找得知采样率的值。



channel_configuration: 表示声道数,⽐如 2 表示⽴体声双声道



0: Defined in AOT Specifc Config


1: 1 channel: front-center


2: 2 channels: front-left, front-right


3: 3 channels: front-center, front-left, front-right


4: 4 channels: front-center, front-left, front-right, back-center


5: 5 channels: front-center, front-left, front-right, back-left, back right


6: 6 channels: front-center, front-left, front-right, back-left, back right, LFE-channel


7: 8 channels: front-center, front-left, front-right, side-left, side-right,back-left, back-right, LFE-channel


8-15: Reserved


接下来看下 adts_variable_header();



frame_length : ⼀个 ADTS 帧的⻓度包括 ADTS 头和 AAC 原始流.frame length, this value must include 7 or 9 bytes of header length:aac_frame_length = (protection_absent = = 1 ? 7 : 9) + size(AACFrame)protection_absent=0 时, header length=9bytesprotection_absent=1 时, header length=7bytesadts_buffer_fullness:0x7FF 说明是码率可变的码流。number_of_raw_data_blocks_in_frame:表示 ADTS 帧中有 number_of_raw_data_blocks_in_frame + 1 个 AAC 原始帧。所以说 number_of_raw_data_blocks_in_frame == 0 表示说 ADTS 帧中有⼀个 AAC 数据块。


下⾯是 ADTS 的 AAC⽂件部分:⾼字节开始



第⼀帧的帧头 7 个字节为:0xFF 0xF1 0x4C 0x40 0x20 0xFF 0xFC 分析各个关键数值:1111111111110001010011000100000000100000111(帧⻓度)1111111111100 计算帧⻓度:将⼆进制 0000100000111 转换成⼗进制为 263。观察第⼀帧的⻓度确实为 263 个字节。计算⽅法:(帧⻓度为 13 位,使⽤unsigned int 来存储帧⻓数值)


unsigned int getFrameLength(unsigned char* str){    if ( !str )    {        return 0;    }    unsigned int len = 0;    int f_bit = str[3];    int m_bit = str[4];    int b_bit = str[5];    len += (b_bit>>5);    len += (m_bit<<3);    len += ((f_bit&3)<<11);    return len;}
复制代码

总结:AAC sequence 三层

第 1 层:AAC sequence。每帧音频数据序列。


第 2 层:AAC Frame。每帧音频数据,包含 header。


第 3 层:AAC ES。音频数据,不包含 header。flv,mp4 的音频数据来自这一层,也就是说不包含 header。


注意:第 2 层的 AAC Frame,一般下只有 1 个 AAC ES,但也有可能有两个 AAC ES。这取决于 number_of_raw_data_blocks_in_frame 的值,如果是 0,代表 1 个 AAC ES;如果死 1,代表代表 2 个 AAC ES。

发布于: 刚刚阅读数: 2
用户头像

公众号:福大大架构师每日一题 2021-02-15 加入

公众号:福大大架构师每日一题

评论

发布
暂无评论
音视频八股文(7)-- 音频aac adts_音视频_福大大架构师每日一题_InfoQ写作社区