AAC 格式详解

news2024/11/26 8:20:55

AAC 格式详解

  • AAC 格式详解
    • AAC 简介
    • AAC 编码规格
      • 频带重现(Spectral Band Replication)
      • 参量立体声(Parametric Stereo)
    • AAC 音频文件格式
      • ADIF
      • ADTS
        • 固定头部
        • 可变头部
        • AAC ES
        • 总结:AAC sequence三层
    • 实例:AAC文件解析
    • 解析AAC文件的C语言代码
    • 参考

AAC 格式详解

AAC 简介

AAC(Advanced Audio Coding)是一种现代的音频编码技术,用于数字音频的传输和存储领域。AAC是MPEG-2和MPEG-4标准中的一部分,可提供更高质量的音频数据。

AAC被认为是MP3的继任者。AAC比MP3的压缩率更高,压缩后的文件越小,二是保真性比MP3强。ACC最开始是基于MPEG-2的音频编码技术,MPEG-4标准出现后,AAC重新集成了其特性,加入了SBR技术和PS技术。

特点:

  1. 更好的声音质量和更低的压缩比,减少了由于压缩而引入的失真和噪音。
  2. 支持多种采样率、声道数和比特率。
  3. 具有很好的灵活性和可扩展性。

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

AAC 编码规格

目前常用的AAC格式有:AAC LC、AAC HE V1、AAC HE V2。

名称技术码率
LC-AAC传统AAC高码率>=80Kbps
HE-AACAAC+SBR中码率<=80Kbps
HE_AACv2AAC+SBR+PS低码率<=48Kbps

它们之间的关系:

在这里插入图片描述

频带重现(Spectral Band Replication)

SBR是一种全新的音频编码增强工具,并已经在ISO/IEC 14496-3:2001/Amd.1:2003中被标准化。它提供了改善低比特率音频和音频编码音质的可能性,这是通过增加在特定比特率的音频带宽或改善在特定质量水平的编码效率而实现的。

SBR可以扩大传统感知编码在低比特率下所能提供的有限的音频带宽,因此它的性能表现相当于或超过模拟FM的音频带宽(15kHz)。SBR也可以改善窄带音频编码的质量,可为广播电台提供12kHz音频带宽的纯音频频道,可用如诸如多语言广播等场合。

由于大多数音频编码都是被严格地限制带宽的,因此SBR的重要性不仅体现在提高音频质量上,而且也体现在提高音频的可读性和理解性上。SBR是以后处理为主的,不过为能指导解码过程,在编码时编码器要先做一些预处理工作。

在这里插入图片描述

从技术角度而言,SBR是在音频压缩算法中的一种实现高效高频率的编码新方法。

当联合SBR一起使用,其主体编码器(比如MP3)只负责处理音频频谱的低频部分。高频部分则由SBR解码器产生,这是紧跟在传统波形解码器之后的一个后处理过程。SBR基于对主体编码器处理得到的低频信号进行的分析,在解码器上重建了高频部分。为了确保精确的重建,一些指导信息以非常低的数据率夹杂在主体编码器产生的码流中一同传输。

重建对于和声和噪声成分同样有效,同时允许在频率范围和时间范围进行适当的修整。结果是,SBR实现了在非常低数据率下的全带宽音频编码,与主体编码器相比,明显地增加了压缩效率。

SBR的性能分析:

SBR可以改善感知音频编码的效率,在中等至低比特率下能提高大约30%(在某些特定情况下可能更高)。SBR具体能够提供的改善程度同时也依赖于其主体编码器。

举例说,联合MP3一起使用SBR(参考mp3PRO相关文章),我们可以在64kbps下达到相对传统的大于100kbps的立体声mp3的音频质量。SBR可应用于单声道,立体声甚至多声道的音频。

因此,可以说,SBR在主体编码器本身可编码的音频信号比特率范围和在有限的音频带宽下的可接受的编码噪音(coding artifacts)水平内提供了最大的效率。

参量立体声(Parametric Stereo)

PS是为提高低比特率立体声信号的音频压缩效率的下一个主要举措。参量立体声在MPEG-4中被完整地定义,并且是aacPlus v2中的新的组成部分。目前,参量立体声技术已面向16-40 kbps的范围进行优化,并能在像24 kbps这样低的比特率下提供高音频质量。

参量立体声编码器从音频信号的立体声影像中分解出其参量表示,而在传统模式下原始信号只会被编码为单声道表示。立体声映像信息被表现为少量的高质量的参量立体声信息,与单声道信号在比特流中同时传输。然后,基于接收到的参量立体声信息,解码器便可重建立体声映像,如下图。

这种做法类似于SBR的做法,也带有MP3中的Joint Stereo联合立体声的味道。

在这里插入图片描述

结果是,合并有参量立体声的低比特率, 例如 24 kbps 的音频比特流, 所能让听众感受到的音频质量是显著地高于不具备参量立体声的相似音频比特流的质量。

参考:

  1. http://www.wavecn.com/content.php?id=117
  2. http://www.wavecn.com/content.php?id=120

AAC 音频文件格式

AAC的音频文件格式有以下两种:

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

  2. ADTS(Audio Data Transport Stream):音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。它的特征类似于MP3数据流格式。这种格式可以用于广播电视。

简言之。ADIF只有一个文件头,ADTS每个包前面有一个文件头。

ADIF

在这里插入图片描述

在这里插入图片描述

ADTS

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

在这里插入图片描述

ADTS头部又分为固定头部、可变头部,下面简单介绍ADTS头部的各个字段含义。

固定头部

固定头部各个字段解析:

在这里插入图片描述

字段比特数说明
syncword12所有位必须为1,即0xFFF
ID10代表MPEG-4, 1代表MPEG-2
layer2所有位必须为0
protection_absent11代表没有CRC,0代表有
profile2配置级别
sampling_frequency_index4标识使用的采样频率,具体见下
private_bit1see ISO/IEC 11172-3, subclause 2.4.2.3 (Table 8)
channel_configuration3取值为0时,通过inband 的PCE设置channel configuration
original/copy1编码时设置为0,解码时忽略
home1编码时设置为0,解码时忽略

详细介绍:

  • syncword:同步位,12bit。
    同步字是ADTS文件的标志符,它用于确定音频帧的开始位置和结束位置,通常为0xFFF。

  • ID:MPEG Version,1bit。
    ID指示使用的MPEG版本。值为0表示MPEG-4,值为1表示MPEG-2。

  • Layer:2bit
    Layer定义了音频流所属的层级,对于AAC来说,其值为0。

  • Protection Absent:1bit
    Protection Absent指示是否启用CRC错误校验。设置 1 表示没有CRC,整个ADST头为7字节;0 表示有CRC,整个ADST头为9字节。

  • Profile:AAC规格,2bit
    该字段的解释取决于ID位的值。如果ID等于1,则该字段包含与ISO/IEC 13818-7中定义的ADTS流中的配置文件字段相同的信息,也就是MPEG-2的规格;当ID为0是表示的是MPEG-4的规格,该字段的值等于 Audio Object Type 的值减1。字段取值如下面图片的表格。
    在这里插入图片描述
    在这里插入图片描述

  • Sampling Frequency Index:采样率下标,4bit
    Sampling Frequency Index表示采样率的索引,它告诉解码器当前音频数据的采样率。这个值的范围是0到15,每个值表示一个特定的采样率。
    在这里插入图片描述

  • Private Bit:私有比特,1bit
    编码时设置为0,解码时忽略。

  • Channel Configuration:音频配置,3bit
    Channel Configuration指示音频的通道数,如单声道、立体声或多声道等。
    在这里插入图片描述

  • Originality:1bit
    Originality指示编码数据是否被原始产生。编码时设置为0,解码时忽略。

  • Home:1 bit
    编码时设置为0,解码时忽略。

可变头部

可变头部字段解析:

在这里插入图片描述

字段比特数说明
copyright_identification_bit1编码时设置为0,解码时忽略
copyright_identification_start1编码时设置为0,解码时忽略
frame_length13当前 ADTS 帧的长度,包括 ADTS 头(固定+可变)和 AAC 原始流,单位byte
adts_buffer_fullness110x7FF 表示码率可变的码流,0x000 表示固定码率的码流
number_of_raw_data_blocks_in_frame2该字段表示当前ADST帧中所包含的AAC帧的个数减一。为了最大的兼容性通常每个ADTS frame 包含一个AAC frame,所以该值一般为0。一个AAC原始帧包含一段时间内1024个采样及相关数据
AAC ES

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

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

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

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

总结:AAC sequence三层

第一层:AAC sequence:多个AAC Frame。

第二层:AAC Frame:AAC header+AAC ES。

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

注意:第2层的AAC Frame,一般下只有1个AAC ES,但也有可能有两个AAC ES。这取决于number_of_raw_data_blocks_in_frame的值,ACC ES 格数 = number_of_raw_data_blocks_in_frame + 1。

实例:AAC文件解析

下图是用编辑器打开一个AAC文件,用十六进制查看的截图:

在这里插入图片描述

没有CRC的情况下,文件开头的7个字节是ADTS帧头部,这里7个字节的数据是:0xff 0xf1 0x4c 0x80 0x20 0x02 0x80,我们按照ADTS帧的头部数据来解析看看这7个字节表示什么?

前面1-12bit为 0xff 0xf,对应了ADTS头部的 syncword 字段,表示ADTS帧的开始。

13-16bit为0x01,二进制是 0001,也就是说:

  1. ID的1bit为0(MPEG-4);
  2. layer的2bit为00;
  3. protection_absent的1bit为1,表示没有CRC,整个头部7个字节。

17-24bit为0x4c,二进制是 0100 1100,意思是:

  1. profile_ObjectType的2bit为 01,结合前面ID为0,表示MPEG-4 AAC LC 规格;
  2. sampling_frequency_index的4bit为0011,也就是0x3,表示采样率为48000;
  3. private_bit的1bit为0;

剩余1bit,结合后面的再看;

25-32bit为0x80,二进制是 1000 0000,意思是:

  1. channel_configuration的3bit(结合前面剩下的1bit)为 010,表示双声道;
  2. original_copy的1bit为0;
  3. home的1bit为0;
  4. copyright_identification_bit的1bit为0;
  5. copyright_identification_start的1bit为0;

剩余2bit,结合下个字段再看;

33-44bit为0x200,二进制是 0010 0000 0000,加上前面剩下的2bit,就是00 0010 0000 0000:

  1. frame_length的13bit为00 0010 0000 000,也就是0x100,表示这个ADTS帧的长度是0x100;那么下个ADTS就是0x100开始的;

剩余1bit,留到下个字段再看;

45-56bit为0x280,二进制是 0010 1000 0000,加上前面剩下的1bit,就是 0 0010 1000 0000:

  1. adts_buffer_fullness的11bit为 0 0010 1000 00,十六进制0xa0;
  2. number_of_raw_data_blocks_in_frame的2bit为 00,表示包含一个AAC frame。

后面的ADTS帧也可以类似上面的过程去解析。frame_length是代表了整个ADTS的大小。

解析AAC文件的C语言代码

详见于:最简单的 AAC 音频码流解析程序

参考

  1. https://blog.csdn.net/sjp1992/article/details/108639633
  2. https://blog.csdn.net/leixiaohua1020/article/details/11822537
  3. https://moonfdd.blog.csdn.net/article/details/130408276
  4. https://blog.csdn.net/gdliweibing/article/details/125118290
  5. https://blog.csdn.net/wkd_007/article/details/135112250
  6. https://blog.csdn.net/yunxiaobaobei/article/details/130785456
  7. https://blog.csdn.net/leixiaohua1020/article/details/50535042
  8. https://www.cnblogs.com/daner1257/p/10709233.html
  9. https://blog.csdn.net/jay100500/article/details/52955232

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

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

相关文章

iOS开发进阶(十三):脚手架创建iOS项目

文章目录 一、前言二、xcode-select 命令三、拓展阅读 一、前言 项目初期&#xff0c;需要搭建项目基本框架&#xff0c;为此离不开辅助工具&#xff0c;即脚手架。当然&#xff0c;IDE也可以实现新建空白项目&#xff0c;但是其新建后的项目结构可能不符合预期设计&#xff0…

基于DWT(离散小波变换)的图像加密水印算法,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

2个办法解决:手机照片永久删除如何恢复到相册

如今&#xff0c;我们都喜欢通过手机记录自己的生活&#xff0c;手机相册更是承载着无数珍贵的回忆。然而&#xff0c;有时我们可能会因为误操作或其他原因&#xff0c;不小心将手机中的照片永久删除。面对这种情况&#xff0c;许多人会感到着急&#xff0c;担心再也找不回那些…

就业班 第二阶段(python) 2401--4.2 day1 python初识

一、Python 语言介绍1、Python 发展历史2、Python 简介3、Python 特点4、Python 的能力二、Linux 编译安装Python31、源码安装1、安装依赖软件包2、下载3、解压安装4、配置共享库文件5、测试python36、测试 pip32、 配置使用国内源安装第三方模块1、创建配置文件补充内容四、变…

蓝桥杯 - 正则问题

解题思路&#xff1a; dfs import java.util.Scanner;public class Main {static int pos -1; // 充当charAt下标static String s;// 字符串型的静态变量public static void main(String[] args) {Scanner scanner new Scanner(System.in);s scanner.nextLine();System.ou…

外贸网站源码定制:助您实现海外市场拓展

在当今全球化的经济环境下&#xff0c;海外市场对于企业的发展变得愈发重要。而在拓展海外市场的过程中&#xff0c;一个功能强大、专业定制的外贸网站源码将成为您的致胜利器。无论是在展示产品、引导客户、还是进行在线交易&#xff0c;外贸网站源码的定制化都能够给您带来更…

2.人机交互-图形化界面的小故事

文章目录 一、图形化界面的小故事二、什么是cmd&#xff1f; 计算机在刚开始出现的时候&#xff0c;因为占地广、造价高、耗电多&#xff0c;一般都是给军队或者政府使用的&#xff0c;而并不是给个人使用的。然后随着计算机不断地发展&#xff0c;体积越来越小&#xff0c;出现…

C++ | Leetcode C++题解之第6题Z字形变换

题目&#xff1a; 题解&#xff1a; class Solution { public:string convert(string s, int numRows) {int n s.length(), r numRows;if (r 1 || r > n) {return s;}string ans;int t r * 2 - 2;for (int i 0; i < r; i) { // 枚举矩阵的行for (int j 0; j i &l…

在编程中使用中文到底该不该??

看到知乎上有个热门问题&#xff0c;为什么很多人反对中文在编程中的使用&#xff1f; 这个问题有几百万的浏览热度&#xff0c;其中排名第一的回答非常简洁&#xff0c;我深以为然&#xff1a; 在国内做开发&#xff0c;用中文写注释、写文档&#xff0c;是非常好的习惯&…

股票价格预测 | Python使用BP神经网络和LSTM神经网络预测股票价格

文章目录 效果一览文章概述代码设计BP神经网络LSTM神经网络效果一览 文章概述 BP神经网络使用

Nginx反向代理和缓存

一、Nginx反向代理 1.调度和代理的区别&#xff1a; 1.调度基于内核层面&#xff0c;代理基于应用层面 2.代理必须实现一手托两家 3.调度不需要监听任何端口&#xff0c;不需要工作任何应用程序&#xff0c;代理需要工作和上游服务器一模一样的进程 4.调度没有并发上限&am…

是谁?写的Java神作一出版就获Jolt图书大奖【抽奖赠书】

送书活动 1️⃣参与方式&#xff1a;点此参与抽书抽奖 2️⃣获奖方式&#xff1a;小程序随机 抽5位&#xff0c;每位小伙伴一本《Effective Java中文2024版》 3️⃣活动时间&#xff1a;截止到 2024-4-6 12:01:00 注&#xff1a;所有抽奖活动都是全国范围免费包邮到家&#xff…

HWOD:等差数列前n项的和

一、知识点 1、杨辉三角 第一行有1个&#xff0c;第二行有2个&#xff0c;第三行有3个&#xff0c;第n行有n个 前n行的和为(n1)*n/2 2、等差数列 等差数列&#xff0c;第1个数&#xff0c;有1个基数&#xff0c;0个公差&#xff1b;第2个数&#xff0c;有1个基数&#xff…

最优算法100例之24-打印1到最大的n位数

专栏主页&#xff1a;计算机专业基础知识总结&#xff08;适用于期末复习考研刷题求职面试&#xff09;系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 输入数字 n&#xff0c;按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3&#xff0c;则…

使用open3d进行人体配准和重建学习记录

使用open3d进行人体配准和重建学习记录 一、使用kinectv2捕捉人体rgb和depth图二、重建部分2.1 泼松重建2.2 滚球重建2.3 alpha重建 一、使用kinectv2捕捉人体rgb和depth图 # -*- coding: utf-8 -*- # Time : 2024/3/20 17:26 # Author : sjh # Site : # File : ma…

外贸建站:WordPress搭建外贸独立站零基础自建站完整教程(2024)

对于做外贸来说&#xff0c;拥有自己的外贸独立网站真的非常重要。在外贸领域&#xff0c;如今各平台竞争激烈&#xff0c;规则多&#xff0c;成本高&#xff0c;价格战、政策变化快&#xff0c;还存在封店风险等等因素。在这种情况下&#xff0c;拥有外贸独立站就能很好规避上…

保卫蓝天:持续努力,任重道远|中联环保圈

经过长达十年的不懈努力&#xff0c;我国在大气污染防治领域取得了令人瞩目的历史性成就。空气质量明显改善&#xff0c;蓝天保卫战初见成效。但是也必须清醒地认识到&#xff0c;目前仍面临着诸多严峻挑战&#xff0c;保卫蓝天的任务依然任重道远。 2023 年&#xff0c;我国空…

使用pip安装Jupyter

通过pip安装Jupyter Notebook. pip install jupyter通过pip安装Jupyter Lab pip install jupyterlab启动Jupyter jupyter notebook

人人都离不开的算法:AI 时代的生存指南

文章目录 一、算法在生活中的“无处不在”二、算法在工作学习中的“智慧助力”三、算法在社会发展中的“驱动力量”四、算法带来的“双刃剑”效应五、应对算法挑战的策略《人人都离不开的算法——图解算法应用》编辑推荐1、通俗易懂2、技术科普3、贴近时代、贴近生活4、启发思考…

pygame--坦克大战(二)

加载敌方坦克 敌方坦克的方向是随机的&#xff0c;使用随机数生成。 初始化敌方坦克。 class EnemyTank(Tank):def __init__(self,left,top,speed):self.images {U: pygame.image.load(img/enemy1U.gif),D: pygame.image.load(img/enemy1D.gif),L: pygame.image.load(img/e…