当前位置: 首页 > news >正文

AAC头部格式,RTP打包格式

一共有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
http://developer.apple.com/library/ios/#technotes/tn2236/_index.html
 
 
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格式的官方说明文档
http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf
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。

相关文章:

  • JNDI学习总结(3)——Tomcat下使用C3P0配置JNDI数据源
  • 51 Nod 1057 N的阶乘【Java大数乱搞】
  • 矛与盾——扫描器盲打对主动安全防护的启示
  • Linux运行级别的配置文件
  • Swift Strings and Characters
  • Munin监控的安装与配置
  • [转载]PhotoShop性能优化
  • [转]公钥,私钥和数字签名这样最好理解
  • 利用国内的源安装 Python第三方库
  • .net反编译的九款神器
  • Spring Cloud Config
  • HADOOP单机系统安装
  • ASCLL
  • 关于mybatis的学习笔记
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • dva中组件的懒加载
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JavaScript-Array类型
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Spring Boot快速入门(一):Hello Spring Boot
  • Unix命令
  • vue-cli3搭建项目
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 从零开始的无人驾驶 1
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 聊聊sentinel的DegradeSlot
  • 前端存储 - localStorage
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 网络应用优化——时延与带宽
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 【干货分享】dos命令大全
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #{}和${}的区别是什么 -- java面试
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (04)odoo视图操作
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • **PHP分步表单提交思路(分页表单提交)
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .net core Swagger 过滤部分Api
  • .NET Framework .NET Core与 .NET 的区别
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET 反射 Reflect
  • .net 无限分类
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比