FFmpeg 默认是可以解码 AAC 格式的音频,但是如果需要获取 PCM16 此类数据则需要经过音频转码。首先要打开解码器,然后向解码器发送 AAC 音频帧(不带 ADTS),然后从解码器获取解码后的音频帧,数据是 float 类型的,如果需要则进行转码流程将 float 转成整型。
一、AAC 音频
AAC 是高级音频编码(Advanced Audio Coding)的缩写,出现于 1997 年,最初是基于 MPEG-2 的音频编码技术。由Fraunhofer IIS、Dolby Laboratories、AT&T、Sony 等公司共同开发,目的是取代 MP3 格式。2000 年,MPEG-4 标准出台,AAC 重新集成了其它技术(PS、SBR),为区别于传统的 MPEG-2 AAC,故含有 SBR 或 PS 特性的 AAC 又称为 MPEG-4 AAC。
AAC 是新一代的音频有损压缩技术,它通过一些附加的编码技术(比如 PS、SBR 等),衍生出了LC-AAC、HE-AAC、HE-AACv2 三种主要的编码,LC-AAC 就是比较传统的 AAC,相对而言,主要用于中高码率(>=80Kbps),HE-AAC(相当于AAC+SBR)主要用于中低码(<=80Kbps),而新近推出的 HE-AACv2 (相当于AAC+SBR+PS)主要用于低码率(<=48Kbps),事实上大部分编码器设成 <=48Kbps 自动启用 PS 技术,而 >48Kbps 就不加 PS,就相当于普通的 HE-AAC。
1.1 种类
FFmpeg 中一共定义了十种 Profile 格式的 AAC,带 MPEG2 为 MPEG2 支持,其他的为 MPEG4 支持的。
avcodec.h
#define FF_PROFILE_AAC_MAIN 0
#define FF_PROFILE_AAC_LOW 1
#define FF_PROFILE_AAC_SSR 2
#define FF_PROFILE_AAC_LTP 3
#define FF_PROFILE_AAC_HE 4
#define FF_PROFILE_AAC_HE_V2 28
#define FF_PROFILE_AAC_LD 22
#define FF_PROFILE_AAC_ELD 38
#define FF_PROFILE_MPEG2_AAC_LOW 128
#define FF_PROFILE_MPEG2_AAC_HE 131
MAIN 代表主规格
LOW 低复杂度规格(Low Complexity)
SSR 可变采样率规格(Scaleable Sample Rate)
LTP 长时期预测规格(Long Term Predicition)
HE 高效率规格(High Efficiency)AAC+
HE_V2 高效率 V2 规格(High Efficiency V2)Enhanced AAC+
LD 低延迟规格(Low Delay)
ELD 增强低延迟规格(Enhanced low Low Delay)
1.2 格式
查看《ISO/IEC 13818-7》可进一步了解 AAC 音频的详细格式。AAC 的音频文件格式有 ADIF 和 ADTS。
ADIF:Audio Data Interchange Format
音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。故这种格式常用在磁盘文件中。
音频数据交换格式序列包括 ADIF 头,字节对齐和实际数据。
adif_id 表示音频数据交换格式的 ID。它的值是 0x41444946 (最高位在前),这是字符串“ADIF”的 ASCII 表示形式。
copyright_id_present 指示copyright_id是否存在。
copyright_id 该字段由一个8位的 copyright_identifier 和一个64位的 copyright_number 组成。
original_copy 参见 ISO/IEC 11172-3 第 2.4.2.3 款对版权的定义。
home 参见 ISO/IEC 11172-3,第 2.4.2.3 小节对 original_copy 的定义。
bitstream_type 指明位流类型的标志:
“0”恒速率比特流;
“1”可变速率比特流。
bitrate 一个23位无符号整数,指示在恒定速率的比特流中比特流的比特率,或在可变速率的比特流中最大峰值比特率(每帧测量)。0表示不知道比特率。
num_program_config_element program_config_element() 的数量。
adif_buffer_fullness 在 adif_sequence() 中对第一个 raw_data_block() 进行编码后 bit reservoir 的状态。
ADTS:Audio Data Transport Stream
音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。它的特征类似于 mp3 数据流格式。
一般情况下 ADTS 的头信息都是 7 个字节,分为 2 部分:
adts_fixed_header() —— 固定部
adts_variable_header() —— 可变部分