首页 > 音视频技术 > flv文件adts头计算
2016
04-29

flv文件adts头计算

常见flv文件封装的音频用的都是aac编码,aac文件有两种格式,一个是AIDS,一个是ADTS(Audio Data Transport Stream 音频数据传输流)。其中ADTS格式用于流式传输,因为每一帧都包含头信息,可以从任一帧开始解码,故用于流式传输。本文主要讲下flv文件中的adts。

adts的头部结构

adts头部大小7个字节或者9个字节(决定于是否包含CRC)。结构定义如下图所示:
flv文件adts头计算 - 第1张  | Jianchihu

MPEG-4 Audio Object Type

  • 0: Null
  • 1: AAC Main
  • 2: AAC LC (Low Complexity)
  • 3: AAC SSR (Scalable Sample Rate)
  • 4: AAC LTP (Long Term Prediction)
  • 5: SBR (Spectral Band Replication)
  • 6: AAC Scalable
  • 7: TwinVQ
  • 8: CELP (Code Excited Linear Prediction)
  • 9: HXVC (Harmonic Vector eXcitation Coding)
  • 10: Reserved
  • 11: Reserved
  • 12: TTSI (Text-To-Speech Interface)
  • 13: Main Synthesis
  • 14: Wavetable Synthesis
  • 15: General MIDI

······

MPEG-4 Sampling Frequency Index

  • 0: 96000 Hz
  • 1: 88200 Hz
  • 2: 64000 Hz
  • 3: 48000 Hz
  • 4: 44100 Hz
  • 5: 32000 Hz
  • 6: 24000 Hz
  • 7: 22050 Hz
  • 8: 16000 Hz
  • 9: 12000 Hz
  • 10: 11025 Hz
  • 11: 8000 Hz
  • 12: 7350 Hz
  • 13: Reserved
  • 14: Reserved
  • 15: frequency is written explictly

MPEG-4 Channel Configuration

  • 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

flv文件获取AudioSpecificConfig

在flv文件中,上述Audio Object Type,Channel Configrartion等信息存储在AudioSpecificConfig结构中,该AudioSpecificConfig结构一般存储在第一个Audio Tag数据中。在ISO 14496-3中AudioSpecificConfig结构按如下定义:
flv文件adts头计算 - 第2张  | Jianchihu
也就是:

如下图所示,我们打开一个音频为aac编码的flv视频文件(本文讨论的都是aac编码的),红色框处是tag data部分数据:
flv文件adts头计算 - 第3张  | Jianchihu

由flv标准文档AudioData定义可知,Audio Tag data部分第一个字节(0xAF)结构如下:
flv文件adts头计算 - 第4张  | Jianchihu

接着一个字节为AACPacketType(0x00):
flv文件adts头计算 - 第5张  | Jianchihu

第一个Audio Tag只包含头信息,不包含具体音频数据,所以AACPacketType值为0。Audio Tag data剩余的才是真正adts帧数据,也就是要把Audio Tag data除去前两个字节。到这里,我们得到了AudioSpecificConfig数据为:0x13 0x88 0x56 0xE5 0xA5 0x48 0x80。在程序中我们先构造一个字符数组,用于存储该数据:

从flv文件中读取Audio Tag data除去前两个字节的数据:

解析AudioSpecificConfig

由前一部分得知AudioSpecificConfig按如下解析:

通过位操作得到相应信息,代码如下:

程序中得到的3个数据我们将在下一部分使用。

计算adts头部

这里我们只讨论adts头部为7个字节的,首先构造一个字符数组存储adts头部:

接着计算得到flv文件所有adts帧头部相同部分:

接下来要计算的数据跟每一个adts帧长度有关,是变化的。如下所示是flv tag的结构,在flv每个tag中,数据部分长度为datasize(tagheader_datasize)。
flv文件adts头计算 - 第6张  | Jianchihu

由前面可知flv中Audio Tag存储的真实adts帧数据长度为tagheader_datasize – 2,此时还要加上7个字节adts头部长度才是完整一帧 adts长度,我们设置该长度为:

然后根据该AdtsLen计算得到头部剩下几位:

至此我们可以得到了每一帧7个字节的adts头部,加上每一个adts帧的数据,可以得到完整的adts文件。

参考文档

1.flv标准说明:http://jchblog.u.qiniudn.com/doc/video_file_format_spec_v10.pdf
2.ISO/IEC 14496-3:http://jchblog.u.qiniudn.com/doc/ISO_IEC_14496-3.PDF

最后编辑:
作者:Jianchihu
管理员——低调做事,低调做人

留下一个回复

你的email不会被公开。

This site uses Akismet to reduce spam. Learn how your comment data is processed.