音频格式之AAC:(2)AAC封装格式ADIF,ADTS,LATM,extradata及AAC ES存储格式

系列文章目录

音频格式的介绍文章系列:
音频编解码格式介绍(1) ADPCM:adpcm编解码原理及其代码实现
音频编解码格式介绍(2) MP3 :音频格式之MP3:(1)MP3封装格式简介
音频编解码格式介绍(2) MP3 :音频格式之MP3:(2)MP3编解码原理详解
音频编解码格式介绍(3) AAC :音频格式之AAC:(1)AAC简介
音频编解码格式介绍(3) AAC :音频格式之AAC:(2)AAC封装格式ADIF,ADTS,LATM,extradata及AAC ES存储格式
音频编解码格式介绍(3) AAC :音频格式之AAC:(3)AAC编解码原理详解



前言

本文主要1-3部分介绍AAC封装格式ADIF,ADTS和LATM,同时因为从mp4等封装容器有extradata模式,故也第4部分介绍extradata模式。最后第5部分介绍AAC压缩数据存储方式。
说明如下:
1:本文主要介绍AAC封装格式,一个只有aac格式的编码的文件可能使用这三种后缀名:aac、m4a、mp4.
2:其中m4a后缀一般只有apple使用,只含有aac音频格式,没有视频。其实就是mp4封装格式,
对于m4a和mp4后缀属于mp4封装,不在这里介绍,后续会单独开篇介绍封装格式之mp4.
3:其中AAC格式包括ADIF,ADTS和LATM.
需要说明的是ADIF,ADTS和LATM只是AAC的三种封装方式,即只是封装方式不同,里面的编码数据都是和extradata模式一样的。
区别在于:
1:ADIF:只有一个头,其余后面都跟着raw data,文件存储体积小,智能从开始处一帧一帧解码,无法跳播,无法从中间位置解码。
2:ADTS:每帧都有7个字节的头,方便跳播,从任何位置都可以直接进行解码。
3:LATM:LATM格式具有很大的灵活性,每帧的音频配置单元既可以带内传输,又可以带外传输。正因为如此,LATM不仅适用于流传输还可以用于RTP传输,特别时CMMB广播默认码流格式为LATM。
4:extradata:这种模式一般是mp4,flv等封装格式中。extradata在header里面,解码时先传输extradata信息,然后开始传输raw data。每个文件只有一个extradata。其余全部时AAC ES。

主要参考资料为:ISO/IEC 13818-7和ISO/IEC 14496-3


1、ADIF

ADIF,Audio Data Interchange Format 音频数据交换格式,该格式一般应用在将音频通过写文件方式存储在磁盘里的场景,不能进行随机访问,不允许在文件中间开始进行解码;只能从文件头开始解码,无法跳播。

1.1 ADIF文件存储格式

ADIF文件存储格式如下:

adif_header byte_alignment raw_data_stream

其中adif_header和raw_data_stream如下表:
请添加图片描述

1.2 adif_header 帧头各字段含义

请添加图片描述

说明如下:
1:byte_alignment 为了保持字节对齐用。
2:可以看到adif只有一个header,里面没有关于每帧信息,因为每帧不是固定大小,故只能按照顺序进行解码,也无法跳播或快进快退。除非自己解码遍历整个文件建立每帧位置表。

2、ADTS

ADTS:Audio Data Transport Stream 音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。这种格式可以用于广播电视。

简言之。ADIF只有一个文件头,ADTS每个包前面有一个文件头。

最常见的ADTS文件存储格式如下:
请添加图片描述
1:aac的adts封装格式类似mp3封装格式,一帧一帧存储,每帧都有同步头,两帧直接允许有冗余数据
2:adts header为7个字节(固定(每帧都一样)header 28bit+变化(每帧之间可能不一样)header28bit)+ 2(crc,可选,一般adts没有crc校验)

2.1 adts_frame

详细的adts封装如下:
请添加图片描述

2.2 adts_fixed_header

其中adts_fixed_header结构如下:
请添加图片描述
ADTS fixed_header 帧头各字段含义

字段 长度 bits 说明 解释
Syncword 12 all bits must be 1 总是0xFFF,代表一个ADTS帧的开始,作为分界符,用于同步每帧起始位置
ID 1 0 for MPEG-4, 1 for MPEG-2
Layer 2 always 0
Protection Absent 1 set to 1 if there is no CRC and 0 if there is CRC
Profile 2 the MPEG-4 Audio Object Type minus 1 代表使用哪个级别和规范的 AAC,其中 01 代表 Low Complexity(LC),其中 profile 等于 Audio Object Type 的值减1
Sampling Frequency Index 4 MPEG-4 Sampling Frequency Index (15 is forbidden) 采样率下标,由于 AAC 的采样率范围是 8KHz-96KHz,所以具体用那个,由该字段决定
Private Bit 1 set to 0 when encoding, ignore when decoding
Channel Configuration 3 MPEG-4 Channel Configuration (in the case of 0, the channel configuration is sent via an inband PCE) 通道配置即声道数,一般 2 表示立体声双声道
Originality copy 1 set to 0 when encoding, ignore when decoding
Home 1 set to 0 when encoding, ignore when decoding

profile定义如下:

profile ObjectType MPEG-2 profile(ID==1) MPEG-4 object type(ID==0)
0 Main profile AAC Main
1 Low Complexity profile(LC) AAC LC
2 Scalable Sampling Rate profile(SSR) AAC SSR
3 (reserved) AAC LTP

profile在 MPEG-4 Audio Object Type(profile_ObjectType+1)参见14496-3的1.5.2.1如下图:
请添加图片描述

2.3 adts_variable_header

adts_variable_header结构如下:

请添加图片描述
ADTS variable_header 帧头各字段含义

字段 长度 bits 说明 解释
Copyrighted identification bit 1 set to 0 when encoding, ignore when decoding
Copyrighted identification Start 1 set to 0 when encoding, ignore when decoding
Aac Frame Length 13 this value must include 7 or 9 bytes of header length FrameLength = (ProtectionAbsent == 1 ? 7 : 9) + size(AACFrame) 一个 ADTS 帧的长度包括 ADTS 头和 AAC 原始流
ADTS Buffer Fullness 11 buffer fullness 0x7FF 表示码率可变的码流,0x000 表示固定码率的码流
Number of AAC Frames 2 number of AAC frames (RDBs) in ADTS frame minus 1, for maximum compatibility always use 1 AAC frame per ADTS frame ADTS 帧中有 number_of_raw_data_blocks_in_frame + 1 个 AAC 原始帧;则 number_of_raw_data_blocks_in_frame == 0 表示 ADTS 帧中有一个 AAC 数据块;(一个 AAC 原始帧包含一段时间内 1024 个采样及相关数据)

2.4 Error detection

Error detection如下:
请添加图片描述

3、LATM

LATM 的全称为“Low-overhead MPEG-4 Audio TransportMultiplex”(低开销音频传输复用),是MPEG-4 AAC制定的一种高效率的码流传输方式,MPEG-2 TS 流也采用LATM作为AAC 音频码流的封装格式之 一。

3.1 LATM文件存储格式

文件存储格式如下:

latm_frame1 latm_frame2

每帧latm_frame存储格式如下:

latm_header byte_alignment raw_data_stream

latm_header格式如下:
请添加图片描述

3.2 latm _header 帧头各字段含义

字段 长度 bits 说明 解释
syncword 11 always:0x2b7 同步头,必须是0x2b7
audioMuxLengthBytes 13 audio mux length 帧长,不包括前面(11+13)bit

AudioMuxElement结构如下:
请添加图片描述
StreamMuxConfig,PayloadLengthInfo,PayloadMux参见ISO/IEC 14496-3。

LATM格式也以帧为单位,主要由AudioSpecificConfig(音频特定配置单元)与音频负载组成。AudioSpecificConfig 描述了一个LATM 帧的信息,音频负载主要由PayloadLengthInfo(负载长度信息)和PayloadMux(负载净荷)组成。

AudioSpecificConfig 信息可以是带内传,也可以是带外传。所谓带内传,就是指每一个LATM 帧,都含有一个AudioSpecificConfig 信息;而带外传,则每一个LATM帧都不含有AudioSpecificConfig 信息,而通过其他方式把AudioSpecificConfig信息发送到解码端,由于AudioSpecificConfig 信息一般是不变的,所以只需发送一次即可。由此可见,
AudioSpecificConfig 信息采用带内传输可适应音频编码信息不断变化的情况,而采用带外传输,可以节省音频传输码率。带内或带外传,由muxconfigPresent 标志位决定。例如流媒体应用中,muxconfigPresent 可设置为0,这样LATM帧中将不含有AudioSpecificConfig 信息,LATM帧通过RTP包发送出去,AudioSpecificConfig 可通过SDP文件一次性传送到解码端。

AudioSpecificConfig 主要参数

参数 含义
numSubFrames 子帧的数目
numProgram 复用的节目数
numLayer 复用的层数
frameLengthType 负载的帧长度类型,包括固定长度与可变长度
audioObjectType 音频对象类型
samplingFrequency 采样率
channelConfiguration 声道配置

音频负载由若干子帧组成,每个子帧由PayloadLengthInfo和PayloadMux组成,与ADTS帧净荷一样,音频负载主要包含原始帧数据。

AAC打包成TS流通常有两种方式,分别是先打包成ADTS或LATM。ADTS的每一帧都有个帧头,在
每个帧头信息都一样的状况下,会有很大的冗余。LATM格式具有很大的灵活性,每帧的音频配置单元既可以带内传输,又可以带外传输。正因为如此,LATM不仅适用于流传输还可以用于RTP传输,
RTP传输时,若音频数据配置信息是保持不变,可以先通过SDP会话先传输StreamMuxConfig(AudioSpecificConfig)信息,由于LATM流由一个包含了一个或多个音频帧的audioMuxElements序列组成。一个完整或部分完整的audioMuxElement可直接映射到一个RTP负载上。

需要说明在开始解码的时候,需要先找到AudioSpecificConfig,才能获取解码信息,才能开始解码。AudioSpecificConfig并不是每帧都含有的

3.3 CMMB中的LATM

当CMMB中音频压缩标准为AAC时,默认采用LATM封装。StreamMuxConfig采用带外传输。
StreamMuxConifg中的若干默认参数如下:audioMuxVersion:0标志流语法版本号为0,
allStreamsSameTimeFraming标志复用到PayLoadMux()中的所有负载共享一个共同的时基音频子帧.

audioObjectType:2 AAC-LC

freameLengthType:0 帧长度是可变的

latmBufferFullness:0xFF 码率可变的码流

4、extradata

这种模式一般是mp4,flv等封装格式中。extradata在header里面,解码时先传输extradata信息,然后开始传输raw data。

4.1 extradata存储格式

extradata存储格式如下:

object_type sample_rate chan_config
5(+6)bits 4(+24)bits 4bits

具体查看ffmpeg的decode_audio_specific_config函数:

/**
 * Decode audio specific configuration; reference: table 1.13.
 *
 * @param   ac          pointer to AACContext, may be null
 * @param   avctx       pointer to AVCCodecContext, used for logging
 * @param   m4ac        pointer to MPEG4AudioConfig, used for parsing
 * @param   gb          buffer holding an audio specific config
 * @param   get_bit_alignment relative alignment for byte align operations
 * @param   sync_extension look for an appended sync extension
 *
 * @return  Returns error status or number of consumed bits. <0 - error
 */
static int decode_audio_specific_config_gb(AACContext *ac,
                                           AVCodecContext *avctx,
 
### AAC 文件存储格式介绍 #### 存储结构概述 AAC(Advanced Audio Codec)是一种高效的音频编码技术,其核心在于提供高质量的音效同时保持较低的数据传输率。为了实现这一目标,AAC采用了多种封装存储方式来适应不同的应用场景。常见的AAC存储格式包括ADIFADTSLATM以及Extradata等[^1]。 - **ADIF (Audio Data Interchange Format)** ADIF 是一种较为简单的固定头部结构形式,主要用于早期版本的AAC文件中。它通过固定的元数据头描述整个音频流的信息,适合于一次性读取的应用场景。 - **ADTS (Audio Data Transport Stream)** ADTS 提供了一种更灵活的方式用于网络环境下的实时播放需求。每一个ADTS帧都有自己的同步字节与配置参数说明,使得解码器可以独立处理每一帧而不依赖外部信息源。 - **LATM/LOAS** LATM/LOAS 则是为了满足多路复用的需求而设计的一种更加复杂的封装方案,特别适用于IP包交换环境中多个媒体对象的同时传送。 - **ExtradataAAC Elementary Stream (ES)** Extradata 主要用来传递静态初始化信息给解码端;而AAC ES则是指未经任何额外容器包裹的实际压缩后的原始音频比特流。具体来说,在某些情况下会将channel configuration information等内容嵌入到element structure里形成最终输出序列如`elementChan1elementChan2...`这样的模式。 #### 技术特点分析 除了上述提到的各种不同类型的存储格式外,还需要注意到的是高效率版HE-AAC及其后续改进型也逐渐成为主流选择之一。这种增强型标准不仅继承了传统AAC的优点还进一步提升了低比特率条件下的表现力[^3]。 另外值得注意的一点就是无论采用哪种具体的物理载体形态——比如单独存在的`.aac`扩展名文件或者是被MP4/MOV视频框架所包容的一部分内容单元——它们背后遵循的技术原理基本一致即都是围绕着如何更好地表达人类听觉感知特性来进行优化调整从而达到既节省空间又能保证良好体验的目的[^2]。 ```python # Python 示例代码展示如何解析简单 ADTS 头部信息 def parse_adts_header(data): syncword = data[:2].hex() # 同步字部分通常占据前两个字节位置 protection_absent_bit = int(bin(data[2])[7]) # 获取保护位是否存在标志 profile_level_id = ((data[2] & 0b00011000) >> 3) | \ ((data[3] & 0b10000000) >> 6) sampling_frequency_index = (data[3] & 0b01111100) >> 2 channel_configuration = (data[3] & 0b00000011) << 2 | \ (data[4] & 0b11000000) >> 6 return { 'syncword': syncword, 'protection_absent': bool(protection_absent_bit), 'profile_level_id': profile_level_id, 'sampling_frequency_index': sampling_frequency_index, 'channel_configuration': channel_configuration } ``` ### 应用领域探讨 由于具备出色的性能指标加上广泛的硬件软件兼容性支持,目前几乎所有的现代化消费电子产品都会或多或少涉及到对AAC的支持操作。例如智能手机上的铃声制作工具可能允许用户导出为.aac格式文件以便直接作为来电提示声音素材使用;在线音乐服务平台也会优先考虑利用该算法进行曲目资源准备因为这样可以在相同带宽限制下提供更多细节丰富的聆听享受机会等等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

littlezls

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值