【音视频 | AAC】AAC音频编码详解

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍AAC音频编码🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、AAC编码规格(Profile)
  • 🎄三、AAC封装格式
    • ✨3.1 ADIF 格式
    • ✨3.2 ADTS 格式
      • ✨3.2.1 ADTS头部
  • 🎄四、总结


在这里插入图片描述

🎄一、概述

AAC(Advanced Audio Coding),中文名:高级音频编码。出现于1997年,基于MPEG-2的音频编码技术。由Fraunhofer IIS、杜比实验室、AT&T、索尼等公司共同开发,目的是取代MP3格式。

2000年,MPEG-4标准出现后,AAC重新集成了其特性,加入了SBR技术和PS技术,为了区别于传统的MPEG-2 AAC又称为MPEG-4 AAC。

本文简单地介绍AAC编码的一些基础概念,以及AAC格式的文件怎么组成的,需要了解更多AAC编码的内容,可以查看其相关文档《ISO-IEC 14496-3_2009》。

在这里插入图片描述

🎄二、AAC编码规格(Profile)

AAC共有9种规格(Profile),以适应不同的场合的需要:

  • MPEG-2 AAC LC:低复杂度规格(Low Complexity) 注:比较简单,没有增益控制,但提高了编码效率,在中等码率的编码效率以及音质方面,都能找到平衡点。
  • MPEG-2 AAC Main:主规格
  • MPEG-2 AAC SSR:可变采样率规格(Scaleable Sample Rate)
  • MPEG-4 AAC LC:低复杂度规格(Low Complexity)—现在的手机比较常见的MP4文件中的音频部份就包括了该规格音频文件
  • MPEG-4 AAC Main:主规格 注:包含了除增益控制之外的全部功能,其音质最好
  • MPEG-4 AAC SSR:可变采样率规格(Scaleable Sample Rate)
  • MPEG-4 AAC LTP:长时期预测规格(Long Term Predicition)
  • MPEG-4 AAC LD:低延迟规格(Low Delay)
  • MPEG-4 AAC HE:高效率规格(High Efficiency)—这种规格适合用于低码率编码,有Nero ACC 编码器支持

最早是基于MPEG-2标准,称为:MPEG-2 AAC。后来MPEG-4标准在原来基础上增加了一些新技术,称为:MPEG-4 AAC。

流行的Nero AAC编码程序只支持LC,HE,HEv2这三种规格,编码后的AAC音频,规格显示都是LC。HE其实就是AAC(LC)+ SBR技术,HEv2就是AAC(LC)+ SBR + PS技术;

这里再说明一下HE和HEv2的相关内容:

HE:HE-AAC v1(又称AACPlusV1,SBR),用容器的方法实现了AAC(LC)+SBR技术。SBR其实代表的是Spectral Band Replication(频段复制)。简要叙述一下,音乐的主要频谱集中在低频段,高频段幅度很小,但很重要,决定了音质。如果对整个频段编码,若是为了保护高频就会造成低频段编码过细以致文件巨大;若是保存了低频的主要成分而失去高频成分就会丧失音质。SBR把频谱切割开来,低频单独编码保存主要成分,高频单独放大编码保存音质,“统筹兼顾”了,在减少文件大小的情况下还保存了音质,完美的化解这一矛盾。

HEv2:用容器的方法包含了HE-AAC v1和PS技术。PS指“parametric stereo”(参数立体声)。原来的立体声文件文件大小是一个声道的两倍。但是两个声道的声音存在某种相似性,根据香农信息熵编码定理,相关性应该被去掉才能减小文件大小。所以PS技术存储了一个声道的全部信息,然后,花很少的字节用参数描述另一个声道和它不同的地方。


在这里插入图片描述

🎄三、AAC封装格式

AAC有两种封装格式:

  • ADIF:全称 Audio Data Interchange Format,音频数据交换格式,该格式一般应用在将音频通过写文件方式存储在磁盘里的场景,不能进行随机访问,不允许在文件中间开始进行解码;只有拿到整个文件时才能开始进行渲染播放;
  • ADTS:全称 Audio Data Transport Stream,音频数据传输流,该格式的特征是用同步字节进行将 AAC 音频截断,然后可以允许客户端在任何地方进行解码播放,适合网络传输场景;

简单来说,ADTS可以在任意帧进行解码,每一个帧都有头信息,但ADIF却只有一个统一的头,所以必须得到所有的数据后才能解码。一个帧就能单独解码。

两种Header的形式也不同,目前一般编码后和抽取出的基本都是ADTS格式音频流。

✨3.1 ADIF 格式

这个格式比较少见,简单认识一下即可,下图是ADIF格式的序列,由adif_headerbyte_alignmentraw_data_stream三部分组成。byte_alignment是用来做字节对齐的,也就是说,ADIF格式由一个ADIF头信息(adif_header) 和 原始数据流(raw_data_stream) 构成。
在这里插入图片描述
下面看看ADIF头信息包括哪些内容,如下图:
在这里插入图片描述

✨3.2 ADTS 格式

ADTS 格式的AAC音频流是由一个个的ADTS帧组成的,下图是ADTS序列的语法,整个序列由若干个adts_frame组成。
在这里插入图片描述
每个ADTS帧都是由ADTS头部AAC音频数据组成,下图是adts_frame的语法,adts_fixed_header(固定头部信息)和adts_variable_header(可变头部信息)都属于ADTS头部数据,raw_data_block表示AAC音频原始数据块。
在这里插入图片描述

下图是网络上对AAC音频流总结的一张图片,可以帮助我们宏观地认识AAC音频流的ADTS格式。
在这里插入图片描述

✨3.2.1 ADTS头部

ADTS头部有两部分,分为固定头部(adts_fixed_header)、可变头部(adts_variable_header):

固定头部(adts_fixed_header)
在这里插入图片描述
字段解析:

  • syncword:占用12bit;
    所有的bit位都是1。总是0xFFF,代表一个ADTS帧的开始,作为分界符,用于同步每帧起始位置。
  • ID:占用 1 bit;
    表示MPEG版本,0代表MPEG-4, 1代表MPEG-2,一般用 0,因为都是属于 MPEG 的规范.。
  • layer:占用 2 bit;
    一直是0;
  • protection_absent:占用 1 bit;
    设置 1 表示没有CRC,整个ADST头为7字节;0 表示有CRC,整个ADST头为9字节。
  • profile_ObjectType:占用 2 bit,表示使用的AAC规格(profile);
    该字段的解释取决于ID位的值。如果ID等于1,则该字段包含与ISO/IEC 13818-7中定义的ADTS流中的配置文件字段相同的信息,也就是MPEG-2的规格;当ID为0是表示的是MPEG-4的规格,该字段的值等于 Audio Object Type 的值减1。字段取值如下面图片的表格。
    在这里插入图片描述
  • sampling_frequency_index:占用 4 bit;
    表示采样率下标,字段取值及解释如下图:
    在这里插入图片描述
  • private_bit:占用 1 bit,编码时设置为0,解码时忽略;
    详细解释参见 ISO/IEC 11172-3, subclause 2.4.2.3 (Table 8)
  • channel_configuration:占用 3 bit;
    通道配置即声道数,一般 2 表示立体声双声道。更多的值参考下图:
    在这里插入图片描述
  • original_copy:占用 1 bit,编码时设置为0,解码时忽略;
  • home:占用 1 bit,编码时设置为0,解码时忽略。

可变头部(adts_variable_header)
在这里插入图片描述
字段解析:

  • copyright_identification_bit:占用 1 bit,编码时设置为0,解码时忽略;
  • copyright_identification_start:占用 1 bit,编码时设置为0,解码时忽略;
  • frame_length:占用 13 bit,当前 ADTS 帧的长度,包括 ADTS 头(固定+可变)和 AAC 原始流,单位byte;
  • adts_buffer_fullness:占用 11 bit,0x7FF 表示码率可变的码流,0x000 表示固定码率的码流;
  • number_of_raw_data_blocks_in_frame:占用 2 bit;
    该字段表示当前ADST帧中所包含的AAC帧的个数减一。为了最大的兼容性通常每个ADTS frame 包含一个AAC frame,所以该值一般为0。一个AAC原始帧包含一段时间内1024个采样及相关数据

crc(16bit)
当protection_absent == 0时,表示存在CRC,这里的两字节CRC,就携带了CRC信息。

在这里插入图片描述

🎄四、总结

👉本文介绍了AAC编码的一些基础知识,重点介绍了ADTS帧的相关内容。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

参考资料:
音频压缩技术:AAC编码
AAC编码介绍
【网络通信 – 直播】音频流编码 – AAC 基础
AAC的ADTS头文件信息介绍
音频编码之aac编码原理

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能监控平台/视频共享融合系统EasyCVR如何做到不被其他软件强制终止?具体如下

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。国标GB28181流媒体视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频…

要给客户圣诞发圣诞祝福了!

因为有两三个项目跟客户在谈,看样子是要赶年前出货的。上个星期跟工厂确认大概放假的时间,有的说一月底,有的说是二月初。 这会再不催下单的话,时间怕是要赶不及了,其中一个客户跟我说公司在做盘点,还要等…

Mac下用Python写iOS自动化测试

安装环境: MacOS Mojave 10.14Xcode10.1 安装libimobiledevice 网上查到的教程 移除所有的 iOS 设备,然后在终端输入以下代码 brew uninstall ideviceinstaller brew uninstall libimobiledevice brew install --HEAD libimobiledevice brew link -…

Unity 使用Input.GetAxis(“Horizontal/Vertical“)移动鼠标没反应的原因

在Unity中,当我们使用Input.GetAxis("Horizontal")和Input.GetAxis("Vertical")通过鼠标移动的返回数值以控制物体移动或其它操作时,却没有反应,令人费解。 首先我们获取返回数值并打印: float horizontal …

前端开发资源网站地址总结

文章目录 一、搜索技巧二、接下来笔者与大家分享一下我个人积累的网站: 1.基础学习类网站2.开发文档类网站3.解决开发难点类网站【各种库,插件,开源网站介绍】4.想要实现快速开发不可不知的5.各种功能网站6.在线工具7.开发人员应知技术8.前端…

【Proteus仿真】【51单片机】贪吃蛇游戏-LCD12864

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使LCD12864液晶,按键等。 主要功能: 系统运行后,LCD12864液晶显示游戏界面,可通过K1-K4键控制蛇的运行方…

vs code(Visual Studio Code)使用Remote SSH插件连接不上,反复输入密码

使用Remote SSH插件连接不上,反复输入密码问题解决分为两步 1,点击此处 可以得到配置文件的存放目录,进入硬盘这个目录 打开这个文件,知道你服务器的所在行ip,整行删掉,尝试再次连接 2,如果1不…

图像卷积操作

目录 一、互相关运算 二、卷积层 三、图像中目标的边缘检测 四、学习卷积核 五、特征映射和感受野 一、互相关运算 严格来说,卷积层是个错误的叫法,因为它所表达的运算其实是互相关运算(cross-correlation),而不是…

【PID学习笔记10】PID公式分析

写在前面 前面已经将控制系统的基础知识点过了一遍,从本节开始,将正式学习PID控制的相关知识,将会从基本的PID公式概念解释,再基于matlab仿真介绍十几种数字式PID的基本概念。本文重点讲解PID的经典公式。 一、连续与离散的概念…

无懈可击的防泄密之旅:迅软DSE在民营银行的成功实践

客户简要介绍 某股份有限公司主体是中部地区的民营银行,由其母公司联合9家知名民营企业共同发起设立。正式开业于2016年,紧紧围绕目标产业生态圈和消费金融,着力打造产业银行、便捷银行、数字银行、财富管理银行为一体的BEST银行&#xff0c…

scrapy批量爬取豆瓣电影排行信息

scrapy批量爬取豆瓣电影排行信息 1.创建项目2.编写items3.douban.py4.pipelines.py5.爬取得到的文件 scrapy的使用及其安装请看这里 使用scrapy框架批量爬取豆瓣电影排行信息,首先看到豆瓣电影链接为 https://movie.douban.com/top250 经过分析,一共10页…

虚幻学习笔记18—C++委托(多播)和事件

一、前言 委托分单播和多播,多播就是可以绑定多个回调函数,然后一次性执行。这样也可以理解为啥多播没有返回值,多个回调函数执行后返回哪一个都是问题啊。而事件呢官方官方文档说法是“对于事件而言,只有定义事件的类才能调用 Br…