音视频入门基础: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原始数据块:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1534725.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

爆品只是日百商家的表面“风光”

前不久,#大学生买爆台州商家的移动收纳筐#的话题上了热搜。现在的大学生相比以前讲究多了,虽然生活费没涨多少,但生活一定要精致。比如,在有限的预算内买各种收纳神器,把宿舍整理地井井有条。 爆品,往往成…

【2024SpringCloud教程】前言闲聊开篇简介

前言大纲 适合对象,从小白到熟手 前置知识,必要的前置基础知识 紧抓核心,与时俱进学最新,停更技术不用看 突出实战,让天下没有难学的技术 一、适合对象,从小白到熟手 两套课程 springCloud SpringCl…

90v转5v500MA内置mos芯片方案

在设计一个90V转5V500mA的DC/DC转换器方案时,可以考虑使用AH7550这款150KHz固定频率PWM降压(降压)DC/DC转换器。AH7550能够以高效率、低纹波和出色的线路和负载调节驱动0.4A负载,且需要最少数量的外部组件,使用简单&am…

css scrollbar-width: none 隐藏默认滚动条

.table-box{ flex: 1; overflow-y: scroll; scrollbar-width: none;} scrollbar-width: none; 隐藏默认滚动条

HAL库学习梳理——I2C

笔者跟着B站铁头山羊视频学习 STM32-HAL库 开发教程。下面对HAL库有关 I2C 课程知识和应用做一个梳理。 省流: uint8_t commands[] {0x00, 0x8d, 0x14, 0xaf, 0xa5};HAL_I2C_Master_Transmit(&hi2c1,0x78,commands,sizeof(commands)/sizeof(commands[0]) ,HA…

灌区信息化发展趋势展望

灌区信息化作为现代农业发展的重要组成部分,正逐渐成为提升水资源管理效率、保障粮食安全与促进农业可持续发展的关键途径。随着信息技术的飞速进步和智能化技术的广泛应用,灌区信息化的未来发展趋势展现出多维度、深层次的变革与创新,其发展…

基坑气膜:创新的绿色施工防护方案—轻空间

随着我国城市化进程的加快,建筑工地密集施工给城市居民带来了扬尘、噪音等环境问题。基坑气膜作为一种创新的绿色施工技术,正在成为解决这些问题的有效方案。该技术在降低环境污染、保障施工进度和提高施工安全性方面发挥着重要作用,逐渐受到…

深度学习张量变换操作利器 einops 基础实践

今天在一个项目调试的时候无意间报错: 以前其实并没有怎么多接触过einops,今天正好碰到了,就简单总结记录下。 解决上面的报错很简单,直接pip安装即可: einops 是一个用于操作张量的库,它提供了一种简洁且…

SpringBoot整合WebSocket实现消息推送或聊天功能示例

最近在做一个功能&#xff0c;就是需要实时给用户推送消息&#xff0c;所以就需要用到 websocket springboot 接入 websocket 非常简单&#xff0c;只需要下面几个配置即可 pom 文件 <!-- spring-boot-web启动器 --><dependency><groupId>org.springframewo…

springboot老年康复中心—计算机毕业设计源码27406

摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出法&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤,采用Springboo框架建设老年康复中心信息管理系统。…

vue2基础系列教程之v-model及面试高频问题

v-model是表单组件里面的核心知识点&#xff0c;这个指令给我们写表单业务带来了很大的方便。 元素标签上的 v-model 指令用于双向绑定数据,它是一个语法糖&#xff0c;可以用于代替 v-bind:value 和 input 例如&#xff1a;<input v-model"message" placeholder…

用户洞察|从被动养老到主动康养,新康养人群的幸福生活新思路

图源&#xff1a;NewAgingPro团队访谈摄影 全龄康养&#xff0c;大势所趋 作者 | NewAgingPro团队 排版 | Lucy 前言 本文将从我国银发经济发展背景出发&#xff0c;结合AgeClub旗下的NewAgingPro新老年商业研究团队持续多年的用户需求调研及访谈分析&#xff0c;深度洞察…

OpenCV运动分析和目标跟踪(1)累积操作函数accumulate()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将一个图像添加到累积图像中。 该函数将 src 或其部分元素添加到 dst 中&#xff1a; dst ( x , y ) ← dst ( x , y ) src ( x , y ) if mask…

SQL Server小技巧之遍历日期

使用背景 一般项目中会遇到&#xff0c;求每日的日报这种&#xff0c;以及计算2个日期内的工作日&#xff0c;或者休息日可能会用到&#xff0c;计算休息日可以用额外的一个字段用来标记当前日期是否是休息日 遍历方式一 DECLARE StartDate DATE 2023-01-01, EndDate DATE …

SSM基于响应式的网上书店系统—计算机毕业设计源码27119

摘 要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理系统的实施在技术上已逐步成熟。管理系统是一个不断发展的新型学科&#xff0c;本文主要通过对响应式的网上书店系统的功能性需求分析&#xff0c;对系统的安全性和可扩展性进行了非功能性需求分析。在详细的…

【C++】详细介绍类的相关语法概念,this,默认成员函数,static,友元,内部类

目录 1. 类的基本概念 1.1 类的语法 1.2 类的访问限定符 1.3 类的两种定义方式 1.4 类的作用域 1.5 类的实例化 1.6 类对象的大小 2. this指针 2.1 概念 2.2 特性 2.3 面试题 3. 类的六个默认成员函数 3.1 构造函数 3.1.1 特性 3.1.2 默认构造函数 3.1.3 函数…

高效数据移动指南 | 如何快速实现数据库 MySQL 到 MongoDB 的数据同步?

在现代企业中&#xff0c;数据无处不在&#xff0c;贯穿于各个业务环节和系统之间。无论是跨系统的数据集成、多地域的数据协同&#xff0c;还是实时应用的数据同步&#xff0c;数据的一致性和及时性都至关重要。在数字化转型的过程中&#xff0c;如何确保不同系统、地域、设备…

OCR2.0--General OCR Theory

引领光学字符识别&#xff08;OCR&#xff09;的新篇章 引言&#xff1a;OCR技术进化的必要性 光学字符识别&#xff08;OCR&#xff09;是一项广泛应用的技术&#xff0c;它能够从图像中提取字符并将其转换为可编辑格式。虽然OCR-1.0在过去取得了广泛应用&#xff0c;但传统…

水滴式多功能粉碎机:粉碎中草药的好帮手

水滴式中草药粉碎机&#xff0c;顾名思义&#xff0c;其设计灵感源自自然界中水滴的柔和与力量。它摒弃了传统粉碎机粗犷的粉碎方式&#xff0c;采用低速研磨技术&#xff0c;模拟水滴穿透岩石的细腻与持久&#xff0c;对中草药进行温和而深入的粉碎。这种技术不仅保留了药材中…

Redis集群_cluster

cluster集群 cluster翻译就是集群&#xff0c;所以cluster集群也叫做redis集群相比于哨兵模式&#xff0c;cluster集群能支持扩容&#xff0c;并且无需额外的节点来监控状态&#xff0c;所以使用这种模式集群的系统会用的更多些redis cluster采用的是去中心化网络拓扑架构&…