一共有2种AAC头格式,一种是StreamMuxConfig,另一种是AudioSpecificConfig
1、AudioSpecificConfig
读写header的代码参考
    ffmpeg libavcodec\aacenc.c put_audio_specific_config()
    ffmpeg libavcodec\mpeg4audio.c avpriv_mpeg4audio_get_config()
    fdk-aac libMpegTPEnc\src\tpenc_asc.cpp transportEnc_writeASC()
    libaacplus aacplusenc.c aacplusEncGetDecoderSpecificInfo()
 
ISO文档 14496-3
    1.6.2.1 "Syntax - AudioSpecificConfig"
http://www.nhzjj.com/asp/admin/editor/newsfile/2010318163752818.pdf
 
该Header的主要成员
  audioObjectType: 基本的object type用5个比特表示。2是AAC-LC,5是SBR,29是PS。
  samplingFrequencyIndex: 4个比特,用来表示采样率表中的索引号
  channelConfiguration: 4个比特,声道数
  if (audioObjectType == 5 || audioObjectType == 29)
    extensionSamplingFrequencyIndex: 4个比特,表明实际的音频采样率
    audioObjectType:  5个比特,表明基本层编码的AOT
  GASpecificConfig
    frameLengthFlag: 1个比特,0表示帧长为1024,1表示帧长为960
    DependsOnCoreCoder: 1个比特
    extensionFlag: 1个比特
 
剩余的扩展字段 
  syncExtensionType:  11个比特,0x2b7表示HE-AAC的扩展
  if (syncExtensionType == 0x2b7) {
    extensionAudioObjectType: 5个比特
    if ( extensionAudioObjectType == 5 ) {
      sbrPresentFlag: 1个比特
      if (sbrPresentFlag == 1) {
        extensionSamplingFrequencyIndex: 4个比特
      }
    }
  }
 
object type、sample rate详细表格可以参考
http://wiki.multimedia.cx/index.php?title=MPEG-4_Audio
 
如果是HE-AAC,有两种explicit和implicit一共三种声明模式。在explicit模式一(hierarchical signaling),AOT是5,然后在channels之后会有扩展的采样率和AOT字段(这里的AOT用于表明基本层编码,一般是2 AAC-LC),fdk_aac采用的这种方式;在explicit模式二(backward compatible signaling),AOT仍然是2(AAC-LC),但在GASpecificConfig后会有同步字0x2b7和sbrPresentFlag,libaacplus采用的是这种方式;在implicit模式,AOT仍然是2(AAC-LC),AudioSpecificConfig没有任何扩展,仍只是2个字节,需要靠解码器在AAC码流中找到SBR的数据
参考论文《A closer look into MPEG-4 High Efficiency AAC》
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.129.4563&rep=rep1&type=pdf
 
 
2、StreamMuxConfig
写header的代码参考
    ffmpeg libavformat\latmenc.c latm_write_frame_heade()
    ffmpeg libavcodec\aacdec.c read_stream_mux_config()
    fdk-aac libMpegTPEnc\src\tpenc_latm.cpp CreateStreamMuxConfig()
 
ISO文档 14496-3
    1.7.3 Multiplex Layer
 
 
其他相关的
1、TS流可以使用ADTS和LATM两种封装格式。在ffmpeg的mpegtsenc中,用了一个amux的AVFormatContext,先把非ADTS的raw aac流写成ADTS或者LATM格式,然后再写入TS流
2、FLV/RTMP有两种AAC AUDIO DATA,0是AudioSpecificConfig,1是raw的AAC流。可以参考flv格式的官方说明文档
3、AAC的LATM over RTP打包格式定义在RFC 3016。SDP中几个参数含义:object,就是AAC的AOT;cpresent=0,表示StreamMuxConfig不出现在码流中;config,就是StreamMuxConfig用base16进行编码。每个RTP包的载荷,最前面是PayloadLengthInfo,每出现一个0xFF表示帧长度+255,直至非0xFF就是剩余的长度;然后就是PayloadMux即AAC的裸流

4、AAC的另外一种RTP打包格式是mpeg4-generic,定义在RFC 3640。SDP中几个参数含义:config,就是AudioSpecificConfig的十六进制表示;sizeLength=13; indexLength=3,这是每个rtp包头都是固定的。每个RTP包的载荷,最前面2个字节一般是0x00 10,这是 AU-headers-length,表示AU header的长度是16个比特也就是2个字节。后面2个字节,高13位是AAC帧的长度,低3位为0。

AAC头部格式的更多相关文章

  1. AAC头部格式,RTP打包格式

    一共有2种AAC头格式,一种是StreamMuxConfig,另一种是AudioSpecificConfig 1.AudioSpecificConfig 读写header的代码参考    ffmpeg ...

  2. 【转】AAC ADTS格式分析

    1.ADTS是个啥 ADTS全称是(Audio Data Transport Stream),是AAC的一种十分常见的传输格式. 记得第一次做demux的时候,把AAC音频的ES流从FLV封装格式中抽 ...

  3. AAC ADTS格式分析

    转自: https://blog.csdn.net/jay100500/article/details/52955232 https://blog.csdn.net/andyhuabing/artic ...

  4. 网络中TCP、IP、MAC、UDP的头部格式信息

    TCP头部格式 字段名称 长度(比特) 含义 TCP头部(20字节~) 发送方端口号 16 发送网络包的程序的端口号 接收方端口号 16 网络包的接收方程序的端口号 序号(发送数据的顺序编号) 32 ...

  5. AAC音频格式详解

    关于AAC音频格式基本情况,可参考维基百科http://en.wikipedia.org/wiki/Advanced_Audio_Coding AAC音频格式分析 AAC音频格式有ADIF和ADTS: ...

  6. (转)AAC ADTS格式分析

    1,ADTS是个啥ADTS全称是(Audio Data Transport Stream),是AAC的一种十分常见的传输格式记得第一做demux的时候,把AAC音频的ES流从FLV封装格式中抽出来送给 ...

  7. TCP头部格式详解,附Wireshark对TCP头部抓包分析

    TCP之所以能为数据通讯提供可靠的传输,主要在于TCP数据包头部功能非常多. 那么,我们先来看看TCP头部格式(RFC 793.1323定义了TCP头部): TCP头部格式中的内容解析如下:(文末还有 ...

  8. TCP和UDP头部格式的了解?

    tcp头部格式如下图所示: 1.源端口号,16位,发送方的端口号. 2.目标端口号,16位,发送方的目标端口号. 3.  32为序列号,sequence number,保证网络传输数据的顺序性. 4. ...

  9. 自动生成脚本头部格式并调用VIM工具

    在我们写脚本的时候,开始总要按照脚本书写规范来定义脚本头部格式,久而久之是不是会觉得麻烦效率低下呢,这里就介绍一个好的思路给大家. 1 首先我们在VIM里先复制个头部格式的内容,这里就抄袭一个二师兄的 ...

随机推荐

  1. IOS连接

    http://www.wuleilei.com/blog/323 不错 http://blog.csdn.net/totogo2010/ http://blog.csdn.net/totogo2010 ...

  2. 【BZOJ4769】超级贞鱼 归并排序求逆序对

    [BZOJ4769]超级贞鱼 Description 马达加斯加贞鱼是一种神奇的双脚贞鱼,它们把自己的智慧写在脚上——每只贞鱼的左脚和右脚上各有一个数.有一天,K只贞鱼兴致来潮,排成一列,从左到右第i ...

  3. 软RAID5制作流程

    说明:本实验没有用到多个磁盘,而是利用单个磁盘划分出的多个分区来仿真的,如果在实际项目中,请依情况而定. 1. 分区 我这里划分6个分区,用4个分区组成RAID 5,用1个分区作为spare disk ...

  4. MyBatis -- 一步步教你使用MyBatis

    1.建立开发环境 1.1  创建项目,java项目或者javaweb项目均可,如图: 1.2  加入所须要的jar包到项目lib文件夹下 一个MyBatis-3.2.4.jar包 一个驱动包mysql ...

  5. go语言之接口一

    在Go语言中,一个类只需要实现了接口要求的所有函数,我们就说这个类实现了该接口 我们定义了一个File类,并实现有Read().Write().Seek().Close()等方法.设 想我们有如下接口 ...

  6. CentOS7安装MySQL8.0小计

    之前讲配置文件和权限的时候有很多MySQL8的知识,有同志说安装不太一样,希望发个文,我这边简单演示一下 1.环境安装 下载MySQL提供的CentOS7的yum源 官方文档:<https:// ...

  7. latex安装

    这里使用的是texlive + winedt方式 下载texlive2018, 使用window的bat文件安装,选项选择如下 具体配置可以参考如下网址 https://blog.csdn.net/w ...

  8. iOS 8以后 定位手动授权问题

    ios8以后 都是手动授权定位权限 不过不处理这块 在ios8以后的系统就会默认永不授权 即关闭了定位权限 处理办法如下 .导入框架头文件 #import <CoreLocation/CoreL ...

  9. Python 不可变对象

    str是不变对象,而list是可变对象. 对于可变对象,比如list,对list进行操作,list内部的内容是会变化的,比如: >>> a = ['c', 'b', 'a'] > ...

  10. Effective java -- 6 方法

    第三十八条:检查参数的有效性 第三十九条:必要时进行保护性拷贝 public class Period { private final Date start; private final Date e ...