音视频八股文(7)-- 音频aac adts

news2025/1/21 7:16:11

AAC介绍

AAC(Advanced Audio Coding)是一种现代的音频编码技术,用于数字音频的传输和存储领域。AAC是MPEG-2和MPEG-4标准中的一部分,可提供更高质量的音频数据,并且相比于MP3等旧有音频格式,AAC需要更少的比特率。

AAC通过使用一些高级的音频编码算法来实现更好的声音质量和更低的压缩比。其中最重要的算法是信号掩蔽技术、短时频谱分析和Psychoacoustic模型。这些算法使得AAC能够在较低的比特率下保持更好的音质,并且减少了由于压缩而引入的失真和噪音。

AAC支持多种采样率、声道数和比特率,以满足不同应用场景的需求。它可以实现从8 kbps到320 kbps的不同比特率的音频压缩,同时实现CD音质甚至更高的音乐体验。

AAC还具有很好的灵活性和可扩展性,包括高级音频编码(High Efficiency AAC,HE-AAC)、带有SBR的HE-AAC v2和LC-AAC(Low Complexity AAC)等变体。此外,AAC还支持与其他多媒体技术(如H.264或MPEG-4)集成使用,并且支持多种容器格式(如MP4、3GP、M4A和ADTS等)。

总之,AAC是一种现代的音频编码技术,具有高质量的音频数据、较低的比特率、灵活性和可扩展性等优点。由于其广泛应用于数字音频传输和存储领域,它已经成为音频压缩领域的标准之一。

AAC ADTS介绍

AAC(Advanced Audio Coding)是一种现代的音频编码技术,被广泛应用于数字音频传输和存储领域。AAC可以提供更高质量的音频数据,同时相比MP3等旧有音频格式,AAC需要更少的比特率。

ADTS(Audio Data Transport Stream)是AAC音频流的容器格式,它是一种通过网络传输音频流的标准格式之一。ADTS文件包含了AAC音频流中的各个元素,并且在音频数据中添加了额外的信息,如同步标记、采样率、通道数等。

ADTS文件由多个部分组成,其中最重要的是头部信息。头部信息通常占据了整个文件中的前7到9个字节,其中包括了一个固定的同步标记(syncword),该标记用于确定音频帧的边界位置。进一步的,头部还包含了一些AAC音频流的基础信息,如声道数、采样率、比特率和编码配置等。

在ADTS文件中,每个AAC音频帧都以一个长度为7或9个字节的ADTS帧头开始,其中包含了同步标记、帧大小、采样率、声道数和其他元数据。接下来是AAC编码的原始音频数据,这些数据会被添加到ADTS帧中,以形成完整的音频帧。

总之,ADTS是AAC音频流的容器格式,提供了一种便捷的方式来传输和存储AAC音频流。通过ADTS,可以轻松地对AAC音频进行封装和解封,以满足各种应用场景的需求。

AAC ADTS Header介绍

AAC ADTS(Audio Data Transport Stream)文件是AAC音频流的一种容器格式,其中最重要的部分之一就是ADTS头部信息。ADTS头部信息占据了整个文件中的前7或9个字节,其中包括了一个固定的同步标记(syncword),该标记用于确定音频帧的边界位置。以下是对ADTS头部信息中各个字段的详细介绍:

  1. 同步字(syncword):2个字节(16位)
    同步字是ADTS文件的标志符,它用于确定音频帧的开始位置和结束位置,通常为0xFFF。

  2. ID (MPEG Version):1个字节(8位)
    ID指示使用的MPEG版本。值为0表示MPEG-4,值为1表示MPEG-2。

  3. Layer:2个比特
    Layer定义了音频流所属的层级,对于AAC来说,其值为0。

  4. Protection Absent:1个比特
    Protection Absent指示是否启用CRC错误校验。当该比特为0时,表明音频数据经过CRC校验,否则未经过CRC校验。

  5. Profile:2个比特
    Profile指示编码所使用的AAC规范类型,如AAC LC、AAC HE-AAC等。

  6. Sampling Frequency Index (Sampling Rate):4个比特
    Sampling Frequency Index表示采样率的索引,它告诉解码器当前音频数据的采样率。这个值的范围是0到15,每个值表示一个特定的采样率。

  7. Private Bit:1个比特
    Private Bit为私有比特,通常被设置为0,没有实际作用。

  8. Channel Configuration:3个比特
    Channel Configuration指示音频的通道数,如单声道、立体声或多声道等。

  9. Originality:1个比特
    Originality指示编码数据是否被原始产生,通常为0。

  10. Home:1个比特
    Home bit通常被设置为0,没有实际作用。

  11. Emphasis:2个比特
    Emphasis指示对信号进行强调处理的类型,一般不使用。

除了上述字段之外,ADTS头部还包括文件长度和帧长度等信息。其中,文件长度指整个AAC ADTS文件的长度,而帧长度则指当前ADTS帧所占的字节数。这些信息可以通过解析ADTS头部来确定音频帧的边界,从而提取出原始的AAC音频数据。

总之,AAC ADTS头部信息包括同步字、ID、Layer、Protection Absent、Profile、Sampling Frequency Index、Private Bit、Channel Configuration、Originality、Home、Emphasis等各个字段,通过这些字段可以读取AAC音频流中的基础信息,并确定音频帧的边界位置。

AAC ES介绍

AAC ES(AAC Elementary Stream)是AAC音频编码的一种基本数据格式,也是AAC音频数据在流式传输和文件存储中的常见格式之一。

AAC ES不同于其他容器格式(如MP4、M4A等),它不包含额外的元数据或结构信息,仅包含未经任何封装或压缩处理的原始音频数据。这些原始数据可以作为音频文件或流传输的基础,同时也可以用于对AAC音频进行转码、编辑或重组。

AAC ES 通常由一系列连续的AAC音频帧组成,每个帧以一个特定的标志符开始,该标志符表示这是一个AAC音频帧。在AAC ES中,每个音频帧拥有相同的长度,但是并不一定包含相同数量的采样点,因为采样率和声道数量可能会发生变化。

AAC ES 的另一个关键特征是其比特流顺序,即数字音频数据的组织方式。AAC ES 采用大端字节顺序,其中高位字节排在前面,低位字节排在后面。此外,在AAC ES中,音频数据按照从左到右、自上而下的顺序排列,与典型的文本文件不同。

总之,AAC ES 是AAC音频编码的一种基本数据格式,它通常由一系列AAC音频帧组成,并且不包含任何附加的元数据或结构信息。AAC ES 可以作为音频文件或流传输的基础,同时也可以用于对AAC音频进行转码、编辑或重组。由于其简单性和灵活性,AAC ES 受到了广泛的应用,并且成为了数字音频编码领域的标准之一。

AAC ADTS格式分析

AAC⾳频格式:Advanced Audio Coding(⾼级⾳频解码),是⼀种由MPEG-4标准定义的有损⾳频压缩格式,由Fraunhofer发展,Dolby, Sony和AT&T是主要的贡献者。

ADIF:Audio Data Interchange Format ⾳频数据交换格式。这种格式的特征是可以确定的找到这个⾳频数据的开始,不需进⾏在⾳频数据流中间开始的解码,即它的解码必须在明确定义的开始处进⾏。故这种格式常⽤在磁盘⽂件中。

ADTS的全称是Audio Data Transport Stream。是AAC⾳频的传输流格式。AAC⾳频格式在MPEG-2(ISO-13318-7 2003)中有定义。AAC后来⼜被采⽤到MPEG-4标准中。这种格式的特征是它是⼀个有同步字的⽐特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。

简单说,ADTS可以在任意帧解码,也就是说它每⼀帧都有头信息。ADIF只有⼀个统⼀的头,所以必须得到所有的数据后解码。

且这两种的header的格式也是不同的,⽬前⼀般编码后的和抽取出的都是ADTS格式的⾳频流。两者具体的组织结构如下所示:

AAC的ADIF格式⻅下图:
在这里插入图片描述
AAC的ADTS的⼀般格式⻅下图:
在这里插入图片描述
空⽩处表示前后帧

有的时候当你编码AAC裸流的时候,会遇到写出来的AAC⽂件并不能在PC和⼿机上播放,很⼤的可能就是AAC⽂件的每⼀帧⾥缺少了ADTS头信息⽂件的包装拼接。

只需要加⼊头⽂件ADTS即可。⼀个AAC原始数据块⻓度是可变的,对原始帧加上ADTS头进⾏ADTS的封装,就形成了ADTS帧。

AAC⾳频⽂件的每⼀帧由ADTS Header和AAC Audio Data组成。结构体如下:

在这里插入图片描述
每⼀帧的ADTS的头⽂件都包含了⾳频的采样率,声道,帧⻓度等信息,这样解码器才能解析读取。

⼀般情况下ADTS的头信息都是7个字节,分为2部分:

adts_fixed_header();
adts_variable_header();

其⼀为固定头信息,紧接着是可变头信息。固定头信息中的数据每⼀帧都相同,⽽可变头信息则在帧与帧之间可变。

在这里插入图片描述
syncword :同步头 总是0xFFF, all bits must be 1,代表着⼀个ADTS帧的开始

ID:MPEG标识符,0标识MPEG-4,1标识MPEG-2

Layer:always: ‘00’

protection_absent:表示是否误码校验。Warning, set to 1 if there is no CRC and 0 if there is CRC

profile:表示使⽤哪个级别的AAC,如01 Low Complexity(LC)— AAC LC。有些芯⽚只⽀持AAC LC 。

在MPEG-2 AAC中定义了3种:
在这里插入图片描述
profile的值等于 Audio Object Type的值减1

profile = MPEG-4 Audio Object Type - 1

在这里插入图片描述
在这里插入图片描述
sampling_frequency_index:表示使⽤的采样率下标,通过这个下标在Sampling Frequencies[ ]数组中查找得知采样率的值。

在这里插入图片描述
channel_configuration: 表示声道数,⽐如2表示⽴体声双声道

在这里插入图片描述
0: Defined in AOT Specifc Config

1: 1 channel: front-center

2: 2 channels: front-left, front-right

3: 3 channels: front-center, front-left, front-right

4: 4 channels: front-center, front-left, front-right, back-center

5: 5 channels: front-center, front-left, front-right, back-left, back right

6: 6 channels: front-center, front-left, front-right, back-left, back right, LFE-channel

7: 8 channels: front-center, front-left, front-right, side-left, side-right,back-left, back-right, LFE-channel

8-15: Reserved

接下来看下adts_variable_header();

在这里插入图片描述
frame_length : ⼀个ADTS帧的⻓度包括ADTS头和AAC原始流.
frame length, this value must include 7 or 9 bytes of header length:
aac_frame_length = (protection_absent = = 1 ? 7 : 9) + size(AACFrame)
protection_absent=0时, header length=9bytes
protection_absent=1时, header length=7bytes
adts_buffer_fullness:0x7FF 说明是码率可变的码流。
number_of_raw_data_blocks_in_frame:表示ADTS帧中有number_of_raw_data_blocks_in_frame + 1个AAC原始帧。
所以说number_of_raw_data_blocks_in_frame == 0 表示说ADTS帧中有⼀个AAC数据块。

下⾯是ADTS的AAC⽂件部分:
⾼字节开始
在这里插入图片描述
第⼀帧的帧头7个字节为:0xFF 0xF1 0x4C 0x40 0x20 0xFF 0xFC
分析各个关键数值:
111111111111
0
00
1
01
0011
0
001
0
0
0
0
0000100000111(帧⻓度)
11111111111
00
计算帧⻓度:将⼆进制 0000100000111 转换成⼗进制为263。观察第⼀帧的⻓
度确实为263个字节。
计算⽅法:(帧⻓度为13位,使⽤unsigned int来存储帧⻓数值)

unsigned int getFrameLength(unsigned char* str)
{
    if ( !str )
    {
        return 0;
    }
    unsigned int len = 0;
    int f_bit = str[3];
    int m_bit = str[4];
    int b_bit = str[5];
    len += (b_bit>>5);
    len += (m_bit<<3);
    len += ((f_bit&3)<<11);
    return len;
}

总结:AAC sequence三层

第1层:AAC sequence。每帧音频数据序列。

第2层:AAC Frame。每帧音频数据,包含header。

第3层:AAC ES。音频数据,不包含header。flv,mp4的音频数据来自这一层,也就是说不包含header。

注意:第2层的AAC Frame,一般下只有1个AAC ES,但也有可能有两个AAC ES。这取决于number_of_raw_data_blocks_in_frame的值,如果是0,代表1个AAC ES;如果死1,代表代表2个AAC ES。

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

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

相关文章

【经典题】二叉搜索树与双向链表

二叉搜索树与双向链表链接 解题思路 思路1 &#xff1a; 中序遍历&#xff0c;将节点放进vector中&#xff0c;再改链接关系&#xff0c;这很容易想出并解决&#xff0c;但这样明显不符合题意。 思路2&#xff1a; 这道题目要求将一个二叉搜索树转换成一个排序的双向链表&a…

php连接sqlserver

1.使用工具 Wampserver--3.3 sqlserver2023 php7.4.33 2.连接流程 1.下载Microsoft Drivers for PHP for SQL Server 下载地址&#xff1a;下载 Microsoft Drivers for PHP for SQL Server - PHP drivers for SQL Server | Microsoft Learn 2.下载Microsoft ODBC Driver …

简记二分算法模板与代码案例:整数二分和浮点数二分

本文以 Java 语言实现&#xff0c;整理的代码模板适用于编程竞赛。对代码模板原理的讲解不多&#xff0c;主要记录一下如何使用。 目录 一、算法模板 &#xff08;1&#xff09;整数二分 &#xff08;2&#xff09;浮点数二分 二、例题 例题&#xff1a;acwing-789.数的范…

开源网安入选“2023年中国信通院开源供应商名录”

近日&#xff0c;为进一步推进开源供应链安全合规发展&#xff0c;中国信息通信研究院云大所发布了“2023年中国信通院开源供应商名录”&#xff08;简称名录&#xff09;&#xff0c;名录供应商均为通过可信开源供应链系列评估的企业。名录范围涵盖云计算、大数据、中间件、数…

【致敬未来的攻城狮计划】第1期 作业汇总贴 + 获奖公布

​ 文章目录 一、写在前面二、种子学员介绍三、作业贴汇总四、小小总结五、获奖公布六、学员有话说七、特别致谢 一、写在前面 时间过得真快&#xff0c;距离 【致敬未来的攻城狮计划】第1期 的发起&#xff0c;已经过去一个多月了&#xff0c;而第1期的真正学习考核期也将在…

虹科案例 | 如何通过智能、非接触式测量解决方案,提高起重机的安全和效率?

PART 1 案例详情 自建造初期以来&#xff0c;起重机行业已经走了很长一段路。技术的使用在行业进步中发挥了重要作用&#xff0c;降低了使用桥式起重机的危险性。特别是&#xff0c;智能、非接触式测量解决方案通过使用高架升降机更安全、更高效、更高效&#xff0c;为行业的进…

如何将化学分子SMILES字符串转化为Pytorch图数据结构——ESOL分子水溶性数据集解析

硬核原创&#xff0c;转载请注明出处&#xff1a; https://leytton.blog.csdn.net/article/details/130406553 一、前言 在用Pytorch图神经网络对化学分子进行数据分析的时候&#xff0c;经常使用现有的数据集。看到自动处理完毕的数据结构&#xff0c;里面的特征值让我们一脸…

springsecurity工作流程

Spring Security 的工作流程如下: 1.当用户请求一个受保护的资源时,Spring Security 的过滤器链会拦截该请求。 2.然后 Spring Security 会判断该请求是否认证(authenticated)和授权(authorized)。 认证(Authentication):验证用户身份,判断用户是否能登录系统。Spring Securi…

Linux应用编程(线程同步)(互斥锁)

对于一个单线程进程来说&#xff0c;它不需要处理线程同步的问题&#xff0c;所以线程同步是在多线程环境下可能需要注意的一个问题。线程的主要优势在于&#xff0c;资源的共享性&#xff0c;譬如通过全局变量来实现信息共享&#xff0c;不过这种便捷的共享是有代价的&#xf…

docker网桥冲突解决方法

Docker网桥网段冲突导致访问不到容器问题 三种情况 一、docker0所用网段与局域网所用网段相同&#xff0c;导致网桥冲突&#xff0c;这会造成冲突网段无法访问docker服务。 解决办法&#xff1a; 1.停止docker&#xff0c;删除冲突网桥 systemctl stop docker ip link del doc…

干货 | 中科院心理所考研复试经验分享

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐&#xff5e; 此时此刻&#xff0c;23年考研的小伙伴估计正在为复试进行准备吧&#xff0c;大家都准备得怎么样了呢&#xff1f; 今天为大家带来的就是我国顶级心理学研究结构—中科院心理所…

leetcode19_删除链表的倒数第 N 个结点

文章目录 题目详情分析Java代码实现 题目详情 leetcode19 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 分析 暴力的方法&#xff0c;两趟遍历&#xff0c;第一个遍历记录总的节点数目&#xff0c;第二次遍历到总结点数-N个位置&…

PyTorch——利用Accelerate轻松控制多个CPU/GPU/TPU加速计算

PyTorch——利用Accelerate轻松控制多个CPU/GPU/TPU加速计算 前言官方示例控制多个CPU/GPU/TPU简单说一下设备环境导包加载数据 FashionMNIST创建一个简单的CNN模型训练函数-只包含训练训练函数-包含训练和验证训练 参考链接 前言 CPU&#xff1f;GPU&#xff1f;TPU&#xff…

边学边记——数据结构☞关于对象的比较(包括对equals()方法的重写,Comparable接口,Comparator接口的介绍)

目录 一、基本类型 二、引用类型——对象的比较 1. 关于同一性的比较 2. 关于相等性的比较 三、Comparable接口 1. 介绍 2. 实现 3. 什么叫做正确的compareTo方法的重写 四、实现Comparator接口&#xff08;基于比较器比较&#xff09; 1. 介绍 2. 实现 3. 使用场景…

CentOS防火墙的常用快捷命令

CentOS是免费开源的Linux发行版之一,它兼容RHEL并由社区进行维护,大多数美国服务器提供对该系统支持。在使用CentOS系统时,您需要了解一些常用命令,比如开启、查看、关闭防火墙等。本文将介绍下CentOS防火墙的常用命令。 CentOS是一种面向企业级服务器环境的Linux发行版,…

D触发器仿真实验

关于D触发器的内容见专栏的单片机原理及应用&#xff0c;主要是时钟脉冲出现时候&#xff0c;会改变输出状态。 下面来做一个D触发器的仿真实验。 部件 使用74LS74&#xff1a;带清除和预置端功能的双上升沿D型触发器 74LS74是一款现代集成电路芯片&#xff0c;属于TTL&…

火爆全网,测试用例技巧-Python实现XMind测试用例转Excel测试用例

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 自动化测试&#x…

Jenkins中Changelog插件使用

Jenkins中Changelog插件使用 通过changlog插件获取每次提交的变更信息 一、安装changelog插件 二、使用changelog 1、新建项目&#xff0c;在构建环境中勾选Add Changelog Information to Environment &#xff0c;输入对应的格式 %3$s(datetime-at%4$s via%1$s) %2$s(type%…

聚焦智慧燃气,美格智能亮相第25届中国国际燃气、供热技术与设备展览会

4月25~27日&#xff0c;第25届中国国际燃气、供热技术与设备展览会在深圳会展中心&#xff08;福田&#xff09;盛大举办。本次展会由中国城市燃气协会主办&#xff0c;自1994年举办以来已历经24届&#xff0c;是国内燃气行业规模巨大的综合性专业展会。美格智能携4G/5G模组、N…

Typora中的数学公式(MarkDown)

Typora中的数学公式&#xff08;MarkDown&#xff09; 添加数学公式方式&#xff1a; 1.选择&#xff1a;段落>公式 2.快捷键&#xff1a;Ctrl Shift M 3.直接输入两个美元符号并回车 展示&#xff1a; 空格&#xff1a;一个斜线\ : a \ b a b a \ b a b 换行&#x…