1. AAC音频编码
AAC(Advanced Audio Coding)是一种用于音频压缩和编码的标准,用于提高音频编码效率。AAC在保持音质的同时,压缩率比MP3更高,它使用更多的编码技术,包括MDCT(Modified Discrete Cosine Transform)和临时噪音形状编码等。
AAC音频编码的主要步骤如下:
- 像元分析:将音频分成许多小部分,每部分被称为一个“像元”。
- 频谱处理:使用Modified Discrete Cosine Transform (MDCT)将每个像元从时间域转换为频率域。
- 声音感知编码:用模型化的人类听觉系统来处理信号,以便更有效地编码音频。这些模型可以帮助删除人耳听不到的音频部分,并缩小的人耳几乎听不到的部分。
- 量化编码:通过量化过程,将声音信息转变为数字信号。
AAC编码规格
以下是AAC编码的规格和它们的主要用途:
-
AAC-LC (Low Complexity Profile):
- 最常用的AAC profile。
- 广泛兼容、低处理复杂度且音质良好。
- 适合用于现代数字音频播放。
-
HE-AAC (High Efficiency AAC, aka AAC+):
- 增加了Spectral Band Replication (SBR)。
- 用于流媒体和广播,特别是在比特率较低时能够保持较好的音质。
-
HE-AAC v2 (aka eAAC+):
- HE-AAC的延伸,增加了Parametric Stereo (PS)。
- 针对单声道信号提供立体声编码,适合极度低比特率的应用。
-
AAC-LD (Low Delay AAC):
- 针对实时通讯设计,如视频会议。
- 低延迟,但比特率比AAC-LC高。
-
AAC-ELD (Enhanced Low Delay AAC):
- 结合了AAC-LD和SBR技术。
- 用于需要高质量和超低延迟的实时应用,如远程音乐表演。
-
MPEG 2 AAC-LC:
- MPEG 2标准中的AAC。
- 较为早期的AAC实现,和MPEG 4 AAC-LC相似。
-
MPEG 2 AAC-SSR (Scalable Sample Rate):
- 可伸缩采样率。
- 较少使用,主要在特定需要中实现。
-
MPEG 2 AAC-PS (Parametric Stereo):
- 并不是一个完整的profile,而是HE-AAC的一部分。
- 用于立体声信号的更高效编码。
-
MPEG 4 AAC-LTP (Long Term Prediction):
- 引入了长时预测编码。
- 被认为有较高的编码效率,但不如AAC-LC广泛支持。
-
MPEG 4 SLS (Scalable to Lossless):
- 也称为HD-AAC。
- 一种可伸缩的编码,可以从有损编码无缝过渡到无损编码。
AAC编码的特点
AAC编码具有一系列重要的特点,使其成为多种应用场景中的首选音频压缩格式:
-
高音质: AAC提供了比MP3更高的音质,在相同比特率下通常有更好的声音复现性。
-
多通道支持: AAC支持多达48个音频通道,包括5.1或7.1环绕声。
-
有效的压缩: 通过高效的编码算法,AAC在较小的文件大小下提供优质的音频。
-
广泛的采样频率: 适用于从8 kHz(电话质量)到96 kHz(高解析度音频)的广泛采样频率。
-
可伸缩性: 高效AAC (HE-AAC) 版本在非常低的比特率下仍然能提供合理的音质,适用于流媒体和广播。
-
低延迟: 针对实时应用,AAC-LD和AAC-ELD提供了低延迟选项,适合视频会议和直播。
-
弹性和适配性: AAC编码可以灵活适应多种编码需求和硬件能力,方便开发者调整以适合特定的产品或服务。
-
兼容性: AAC是国际标准,由多个设备和平台广泛支持。
-
元数据支持: AAC格式可以嵌入丰富的元数据信息,包括歌曲标题、专辑封面和其他标签信息。
-
数字版权管理(DRM)支持: 在某些情况下,AAC格式可以结合数字版权管理技术使用,以保护版权内容。
AAC音频文件格式
在AAC音频编码中,有两种广为人知的文件格式:ADIF(Audio Data Interchange Format)和ADTS(Audio Data Transport Stream)。这两种格式包含编码音频数据,但它们各有特点和用途。
ADIF
AAC ADIF格式的文件的基本结构是由一个56字节的文件头和随后的音频帧数据组成的。下面是该文件头的详解:
-
adif_id
: 这是一个32位(4字节)的字段,主要用于识别文件是不是ADIF格式。它的值通常是’ADIF’。 -
copy_id_present
: 这是一个1位的字段,用于标识是否有额外的版权字段。如果设置为1,则后面会跟着一个72字节的版权信息。 -
home
: 这是一个1位的字段,通常设置为0。 -
bitstream_type
: 这是一个1位的字段,用于标识比特流是常量比特率(CBR)还是变量比特率(VBR)。0表示CBR,1表示VBR。 -
bitrate
: 这是一个23位的字段,代表着比特流的比特率。 -
num_program_config_elements
: 这是一个4位的字段,表示ADIF文件中的"program_config_element"的数量。通常这个值为0。 -
adif_buffer_fullness
: 这是一个20位的字段,表示缓冲区的大小。
ADIF文件头之后就是实际的音频帧数据。每个音频帧都有自己的头信息和数据内容,包括帧的长度、采样率、声道数等信息。
ADTS
ADTS帧由两大部分组成:ADTS固定头和ADTS可变头,随后是原始AAC帧数据。
ADTS固定头(共有7字节)
- Syncword (同步字): 固定为0xFFF, 占据前12位,用于标识每个ADTS帧的开始。
- MPEG Version (MPEG版本): 1位,区分是MPEG-2(1)还是MPEG-4(0)编码。
- Layer: 2位,总是为0。
- Protection absent (CRC校验): 1位,表示是否禁止错误校验。1表示没有CRC,0表示有CRC。
- Profile (编码配置文件): 2位,用于表示AAC的编码层次。
- Sampling frequency index (采样频率索引): 4位,代表音频数据的采样率。
- Private bit (私有位): 1位,可以自由使用,但在多数情况下为0。
- Channel configuration (声道配置): 3位,表示音频数据是单声道、立体声等。
- Originality: 1位,暂未使用。
- Home: 1位,暂未使用。
ADTS可变头
- Copyright (版权): 1位,标识是否有版权。
- Copy protection (拷贝保护状态): 1位,标识是否允许复制。
- Frame length (帧长度): 13位,代表整个ADTS帧的长度,包括头部和数据。
- Buffer fullness (缓冲区满度): 11位,表示解码器缓冲区的状态。
- Number of AAC frames (音频帧的数量): 2位,一个ADTS帧内可能含有多个AAC原始帧。
错误校验
如果protection absent字段置0,表示存在2字节的错误检验码(CRC校验),来保障数据完整性。
紧接着这些头信息之后,便是AAC编码的音频数据。每个ADTS帧都包含这样的头信息,因此音频流可在任何帧的头信息处实现同步,非常适合流媒体传输的场景。由于ADTS头部本身并不复杂,它对于传输过程的额外开销也比较小。
AAC文件处理流程
1. AAC音频解码:
ffmpeg -i input.aac -c:a pcm_s16le output.wav
这个命令将AAC格式的文件解码为WAV格式。-i
指定输入文件,-c:a pcm_s16le
指定音频编码器为PCM编码的16位小端(-s16le)格式。
2. AAC音频编码:
ffmpeg -i input.wav -c:a libfdk_aac output.aac
此命令将WAV格式的音频文件编码为AAC格式的文件。这里,-c:a libfdk_aac
表示使用libfdk_aac编码器来编码音频。
3. 视频转码并将音频编码为AAC
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mkv
该命令将一个MP4格式的视频转码为MKV格式,同时将音频编码为AAC。这里,-c:v libx264
用于指定视频使用libx264编码器(即,H.264编码),-c:a aac
用于指定音频使用aac编码。
4. 剪辑AAC音频
ffmpeg -i input.aac -ss 00:00:30 -to 00:01:30 output.aac
这个命令将从输入的AAC音频文件中剪辑出30秒到1分30秒之间的部分。-ss
参数用于设置剪辑的起始时间,-to
参数用于设置剪辑的结束时间。
AAC ES 详解
Elementary Stream(基本流)
Elementary Stream是一种仅包含单一媒体类型(音频或视频)数据的格式。在音频ES中,不包含任何额外的元数据或者是多媒体容器封装信息,仅仅是纯粹的音频数据。对于AAC而言,ES通常指裸的AAC码流。
AAC ES的处理
要处理AAC ES,开发者需要使用各种编解码库,如FFmpeg的库来解码或编码AAC流。流程大概分为这几步:
- 编码:将原始音频信号(PCM数据)通过AAC编码器转换成AAC ES。
- 解码:将AAC ES通过AAC解码器转换回原始音频信号(PCM数据)用于播放。
封装和传输
在将AAC ES送入网络或存储到文件之前,通常需要将AAC ES封装到某种容器格式中,例如MP4、MKV或ADTS(Audio Data Transport Stream)。封装操作不仅仅是将音频数据“包装”起来,还包括添加同步、错误检测与恢复、元数据(比如音频的采样率、比特率等信息)等。
流媒体中的AAC ES
在流媒体应用中,AAC ES常常以切片(segment)的形式存在。在HTTP Live Streaming (HLS)和Dynamic Adaptive Streaming over HTTP (DAS