背景
最近在媒体库中需要加入AAC,要求能与华为的某型号IP语音通过AAC对通。
这个需求的功能并不复杂,而难在对AAC的封装格式标准及编解码库的使用,需要有一个系统性的认识。
AAC标准光编码规格就有好几种,并且针对不同的场景衍生出的封装格式也有好几种。应用到流媒体,rfc也有几个。所以是细节特别多。很容易走错方向。
这里做个总结,这将是一系列文章,先介绍AAC封装标准,RTP封包标准,再讲解libfdk-aac的用法,及在RTP流媒体中应用时所需注意的细节。
简介
-
AAC
AAC是在MPEG-2和MPEG-4中定义的,是一系列编码规格的统称。
AAC标准包括一系列编码规格,这里列出常用的几种:AAC-LC,AAC-LD,AAC-ELD,HE-AAC。可以将它们之间的关系理解成H264中base,main,high profile的关系。AAC-LC定义在MPEG-2中。AAC-LD,AAC-ELD,HE-AAC定义在MPEG-4中。 -
应用场景
既然是一种音频编码格式,它有两大基本应用场景:
- 媒体存储文件(storage),如常见的h264+aac的mp4文件。
- 流媒体(stream),如rtp 携带aac媒体流。
- 封装格式:
WAV格式是封装的PCM 音频码流(封装格式是记录码流中的信息,比如采样率,声道数等),那么对于的AAC也有封装格式,并且对不同的场景有不同的封装格式。包括:
- ADIF(用于文件存储)
- ADTS(流媒体或文件存储)
- LOAS(流媒体)
- LATM(流媒体)
ADIF和ADTS定义MPEG-2中,LOAS和LATM定义中MPEG-4中。
- RTP封包方式
针对流媒体应用场景,有三个rfc文档: rfc3640,rfc3016,rfc6416(为rfc3016的升级版)定义了rtp封包方式
封装格式
其实针对流媒体的应用场景,不必关心具体的编码数据,主要是要了解封装格式。下面这张表将AAC的几种封装格式及应用场景罗列的比较清楚
封装格式中的几个基本字段(结构)的意义
- AOT
AAC标准定义了一系列规格,也定义一个标识它们的方式,就是AOT值(Audio Object Types),如下表:
上面列出了最见的AOT值,一定要注意这个值至关重要,它直接标识是哪一种AAC编码规格。就直接影响到封装格式的结构,因为不同的规格需要的参数不同。
- AudioSpecificConfig结构
对音频数据而言,通常是需要知道音频的一些信息,如采用率,声道,采样点的位数,一帧音频数据的长度。这些信息需要以一种方式记录,AudioSpecificConfig结构就是用作此。
AudioSpecificConfig是在MPEG-4中定义的。MPEG-2并没有用定义。所以ADIF和ADTS中没有。
下面列一个AudioSpecificConfig结构图
ADIF,ADTS,LATM/LOAS
- ADIF
音频数据交换格式,这种格式一般应用在媒体文件中,不能进行随机访问,不允许在文件中间开始进行解码。只有拿到整个文件时才能开始进行渲染播放。
- ADTS
音频数据传输流,应用在流媒体场景,允许解码端从任意地方解码。
以上两种格式是最常见的封装格式, 这篇文件介绍的很详细
- LATM和LOAS格式
即MPEG-4 Audio transport,LATM,LOAS分属这个机制的两层封装格式定义。一个叫复用层(LATM),一个叫同步层(LOAS)。
1.LATM
The multiplex layer (Low-overhead MPEG-4 Audio Transport Multiplex: LATM) manages multiplexing of
several MPEG-4 Audio payloads and their AudioSpecificConfig() elements
2.LOAS
The synchronization layer specifies a
self-synchronized syntax of the MPEG-4 Audio transport stream which is called Low Overhead Audio Stream
(LOAS).
两个分层封装的使用场景
The interface format to a transmission layer depends on the conditions of the underlying transmission
layer as follows:
• LOAS shall be used for the transmission over channels where no frame synchronization is available.
• LOAS may be used for the transmission over channels with fixed frame synchronization.
• A multiplexed element (AudioMuxElement() / EPMuxElement()) without synchronization shall be used only for
transmission channels where
如上段话的意思,LOAS可带可不带,取决于下层的transmission层。
下图所示清晰的描述了两者的关系
LOAS封装的格式 = 同步信息+LATM
下图所示,LATM/LOAS的结构
LATM/LOAS更适宜于流媒体传输场景,既然LATM叫复用层,那么它是可以携带多个audio frame。相比ADTS的方式更加简洁。