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

音视频入门基础:AAC专题(3)——AAC的ADTS格式简介

一、引言

AAC(Advanced Audio Coding)有两种格式:

1.ADIF(Audio Data Interchange Format,音频数据交换格式):整个流中只包含一个Header(文件头),不能在任意处读取。这种格式基本用不到。

2.ADTS(Audio Data Transport Stream,音频数据传输流):每一帧的音频压缩数据包中都有一个Header,记录音频的采样率、通道数等参数,使得解码可以在流的任何位置开始。所以一般都是用ADTS包装的AAC。

这两种格式的Header不一样,本系列主要针对ADTS格式的AAC进行讲解。首先我们从《音视频入门基础:AAC专题(1)——AAC官方文档下载》下载AAC的标准文档《ISO_IEC_13818-7_2006(E).pdf》和《ISO14496-3-2009.pdf》,以及MP3的标准文档《ISO11172-3.pdf》。现在一般都是用MPEG-4的AAC,所以我们主要阅读《ISO14496-3-2009.pdf》,但是对于从MPEG-2中继承下来的属性,我们需要翻阅《ISO_IEC_13818-7_2006(E).pdf》,对于从MP3中继承下来的属性,我们需要翻阅《ISO11172-3.pdf》。

注:《ISO_IEC_13818-7_2006(E).pdf》总共有202页,《ISO14496-3-2009.pdf》总共有1416页,下面的页数是指在pdf阅读器中显示的页数:

二、ADTS格式的Header

(一)ADTS Header的基本概念

根据《ISO14496-3-2009.pdf》第121页,ADTS序列(ADTS流)由一个个adts音频帧(adts音频压缩数据包)组成。使用syncword分割各个adts音频帧:

根据《ISO14496-3-2009.pdf》第29页,syncword为嵌入在ADTS流中的一种编码,用于标识ADTS音频帧的起始位置:

根据《ISO14496-3-2009.pdf》第122页,adts_variable_header中的number_of_raw_data_blocks_in_frame属性的值为0的情况下,每个adts帧由adts_fixed_header(固定头)、adts_variable_header(可变头)、adts_error_check(错误校验)、raw_data_block(原始数据块)组成:

其中,ADTS Header由adts_fixed_header、adts_variable_header和adts_error_check组成。根据《ISO14496-3-2009.pdf》第123页,adts_fixed_header中的protection_absent属性的值为0时,adts_error_check才会存在CRC校验。所以当protection_absent为0时,adts_error_check占16位(2字节),当protection_absent不为0时,adts_error_check占0位(0字节):

adts_fixed_header固定占28位,adts_variable_header也占28位。所以当protection_absent为0时,ADTS Header占9字节;protection_absent不为0时,ADTS Header占7字节。

(二)adts_fixed_header

根据《ISO14496-3-2009.pdf》第122页,adts_fixed_header包含的属性如下。从下表中可以看到每个属性占的位数,这些属性加起来总共占28位,所以adts_fixed_header固定占28位:

根据《ISO14496-3-2009.pdf》第32页,bslbf(bit string,left bit first)表示比特串,左位在先。

uimsbf(unsigned integer,most significant bit first)表示无符号整数,高位在先。具体可以参考:《uimsbf和 bslbf的含义》:

syncword:占12位。关于syncword属性的值的描述,在《ISO14496-3-2009.pdf》中并没有提到,但是在《ISO_IEC_13818-7_2006(E).pdf》可以找到关于它的说明。从上文我们可以知道,syncword为嵌入在ADTS流中的一种编码,用于标识ADTS帧的起始位置。根据《ISO_IEC_13818-7_2006(E).pdf》第45页,,syncword的每个位都必须被设置为1,也就是0b111111111111:

ID:占1位。根据《ISO14496-3-2009.pdf》第124页,ID为MPEG版本的标识符。如果ADTS流中的音频数据是MPEG-2 AAC,ID被设置为1,如果音频数据是MPEG-4 AAC,其被设置为0:

layer:占2位。根据《ISO_IEC_13818-7_2006(E).pdf》第45页,layer总被设置为00:

protection_absent:占1位。根据《ISO_IEC_13818-7_2006(E).pdf》第45页,protection_absent表示CRC校验是否存在。从上文可以知道,当protection_absent为0时,CRC校验存在,当protection_absent为1时,CRC校验不存在:

profile_ObjectType:占2位。根据《ISO14496-3-2009.pdf》第124页,MPEG版本为MPEG-4时,如果profile_ObjectType为0,AAC的规格为AAC Main;如果profile_ObjectType为1,规格为AAC LC;如果profile_ObjectType为2,规格为AAC SSR;如果profile_ObjectType为3,规格为AAC LTP:

samplingFrequencyIndex:占4位。根据《ISO14496-3-2009.pdf》第59页,samplingFrequencyIndex表示音频的采样频率:

private_bit:占1位。《ISO_IEC_13818-7_2006(E).pdf》和《ISO14496-3-2009.pdf》里面没有对其进行任何说明。在《ISO_IEC_13818-7_2006(E).pdf》第46页,写了想要了解private_bit属性得查阅标准文档《ISO/IEC 11172-3》:

所以我们从https://csclub.uwaterloo.ca/~pbarfuss/ISO11172-3.pdf 下载《ISO11172-3.pdf》,在其第23页终于找到关于private_bit属性的说明了,意思就是private_bit没用:

channel_configuration:占3位。根据《ISO14496-3-2009.pdf》第60页。channel_configuration表示音频声道数。比如channel_configuration值为1表示是单声道(center front speaker);值为2表示是双声道(left, right front speakers);值为3:三声道(center, left, right front speakers);值为4:四声道(center, left, right front speakers, rear surround speakers);值为5:五声道(center, left, right front speakers, left surround, right surround rear speakers);值为6: 5.1声道(center, left, right front speakers, left surround, right surround rear speakers, front low frequency effects speaker);值为7:7.1声道(center, left, right center front speakers, left, right outside front speakers, left surround, right surround rear speakers, front low frequency effects speaker);值为8到15:保留:

original_copy:占1位。该属性继承自mp3里的copyright属性。根据《ISO11172-3.pdf》第24页,如果这个比特位等于0,则表示编码的比特流没有版权,1表示版权受保护:

home:占1位。该属性继承自mp3里的original/home属性。根据《ISO11172-3.pdf》第24页,如果比特流是一个拷贝,home的值为0,如果是原始比特流,则值为1:

(三)adts_variable_header

根据《ISO14496-3-2009.pdf》第122页,adts_variable_header包含的属性如下。从下表中可以看到每个属性占的位数,这些属性加起来总共占28位,所以adts_variable_header固定占28位:

copyright_identification_bit:占1位。根据《ISO_IEC_13818-7_2006(E).pdf》第46页,copyright_identification_bit为72位版权标识字段中的一位:

copyright_identification_start:占1位。根据《ISO_IEC_13818-7_2006(E).pdf》第46页,copyright_identification_start表示copyright_identification_bit音频帧是72位版权标识的第一位。如果没有版权标识传输,此位应保留' 0 ':

aac_frame_length:占13位。根据《ISO_IEC_13818-7_2006(E).pdf》第46页,aac_frame_length为整个ADTS音频帧的长度,包含ADTS Header、错误校验和AAC原始数据块,单位为字节:

adts_buffer_fullness:占11位。根据《ISO_IEC_13818-7_2006(E).pdf》第46页至47页,adts_buffer_fullness为在adt编码过程中,比特储存的状态。如果值为0x7FF,表示比特流是可变速率比特流:

number_of_raw_data_blocks_in_frame:占2位。根据《ISO_IEC_13818-7_2006(E).pdf》第47页,一个ADTS音频帧中有number_of_raw_data_blocks_in_frame + 1个AAC原始数据块。number_of_raw_data_blocks_in_frame的值为0表示该ADTS音频帧中只有一个AAC原始数据块:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python中Web开发框架的使用
  • C++掉血迷宫
  • rockylinux9.4单master节点k8s1.28集群部署
  • WordPress建站钩子函数及使用
  • [数据集汇总]智慧交通-铁路相关数据集汇总
  • USDT自动化交易【Pinoex】【自动化分析】【ChatGPT量化脚本】
  • mysql时间戳格式化yyyy-mm-dd
  • HarmonyOS NEXT 封装实现好用的网络模块(基于最新5.0的API12)
  • 全志A523 系统篇(一) 获取vmlinux
  • ASP.NET MVC 迅速集成 SignalR
  • 将硬盘的GPT 转化为MBR格式
  • 如何避免在使用 Context API 时出现状态管理的常见问题?
  • Redhat 7,8系(复刻系列) 一键部署Oracle21c-xe rpm
  • 在Android中fragment的生命周期
  • 【多模态融合】【NeurIPS 2021】Attention Bottlenecks for Multimodal Fusion
  • [译]如何构建服务器端web组件,为何要构建?
  • 【Leetcode】104. 二叉树的最大深度
  • C++类的相互关联
  • ES10 特性的完整指南
  • ES2017异步函数现已正式可用
  • flask接收请求并推入栈
  • Flex布局到底解决了什么问题
  • LintCode 31. partitionArray 数组划分
  • Lsb图片隐写
  • Mac转Windows的拯救指南
  • Mocha测试初探
  • mysql_config not found
  • MySQL主从复制读写分离及奇怪的问题
  • select2 取值 遍历 设置默认值
  • uni-app项目数字滚动
  • 关于List、List?、ListObject的区别
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 新版博客前端前瞻
  • 《天龙八部3D》Unity技术方案揭秘
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #php的pecl工具#
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (06)Hive——正则表达式
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (C语言)fread与fwrite详解
  • (vue)页面文件上传获取:action地址
  • (WSI分类)WSI分类文献小综述 2024
  • (补)B+树一些思想
  • (定时器/计数器)中断系统(详解与使用)
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (十五)使用Nexus创建Maven私服
  • (四)JPA - JQPL 实现增删改查