一共有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. Zxing二维码解析——图文转换

    一:文字转化为二维码图片. package com.xhm.tool; import java.util.Hashtable; import android.graphics.Bitmap; impo ...

  2. Composer的Autoload源码实现2——注册与运行

    前言 上一篇 文章我们讲到了 Composer 自动加载功能的启动与初始化,经过启动与初始化,自动加载核心类对象已经获得了顶级命名空间与相应目录的映射,换句话说,如果有命名空间 'App\Consol ...

  3. 数据库导入Excel-从基础做起

    近期一直跟着师傅做考试系统的基础.每天与大量的数据打交道.数据的导入.数据的导出.视图的导入导出.核对信息等等,收获挺多的,培养了自己的耐心和细心,也进一步了解了数据库. 一切从基础做起! 来看看近期 ...

  4. 笔试真题解析 ALBB-2015 算法project师实习生机试

    1.用十进制计算30!(30的阶乘),将结果转换成3进制进行表示的话,该进制下的结果末尾会有____个0. [解析] 计算N.下3进制结果末尾有多少个0,事实上就是计算3进制中的3被进位多少次,仅仅要 ...

  5. LNMP环境搭建(一:nginx)

    1.从nginx官网获取源码包 # cd /usr/local/src # wget http://nginx.org/download/nginx-1.10.3.tar.gz 2.解压源码包 # t ...

  6. 九度OJ 1185:特殊排序 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:15588 解决:3592 题目描述: 输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序. 输入: 输入第一行包括1个整数N,1< ...

  7. YY大厅接受不到documentcompleted事件处理

    多玩大厅在接受到了页面的documentcompleted事件,才会把遮在页面前面的YY游戏中去掉,我们的游戏页面,YY大厅接收不到事件,所以就排查了下 发现原因在于js脚本里有个用iframe做上报 ...

  8. 7 Javascript:表单与验证-非空验证

    表单提交前要检查数据的合法性 在要对表单里的数据进行验证的时候,能够利用getElementById()来訪问网页上不论什么一个元素 每一个表单域都有一个form对象,可被传给不论什么验证表单数据的函 ...

  9. Docker的前世今生

    核心知识点: 1.Docker的构想:对应用的封装.分发.部署.运行的生命周期的管理,一次封装到处运行 2.Docker的优点:一站式解决方案 3.Docker由LXC演变而来,迟迟没有集成到Linu ...

  10. python cookbook 数据结构

    保留最后n个元素: from collections import deque def search (lines, pattern, history=): previous_lines = dequ ...