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

AAC高级音频编码技术

一、什么是AAC

        AAC的中文名称是高级音频编码技术,它是基于MPEG-2的一种全新的音频编码技术。随着时代的发展,目前AAC的技术升级到MPEG-4表准。AAC广泛的应用在网络传输、高清录制等领域,而AAC技术的出现就是为了取代之前的MP3格式。

二、为什么需要进行AAC进行音频压缩处理

        一帧普通的PCM数据的比特率是很高的,以采样率48000,双声道、采样深度S16的PCM数据传输,假设视频文件是10分钟,那么视频大小就是100多M,这样的大小在网络传输中是不可取的,引入AAC后原来100多M的音频数据被压缩后只有几M

三、AAC的特点和优势

        1.高压缩率:AAC的压缩比为1:20,远比MP3的1:10高,相同时长的音频大小远远小于MP3大小

        2.音质更好:AAC的音频还原度很高,音质相比于其他格式更加的优秀

        3.更高的解码效率:解码播放AAC音频文件时,所占用的资源更少,解码时CPU使用率更低

四、AAC格式详解

        AAC有两种不同的表现形式,一个是ADIF形式,另一种是ADTS形式。

        ADIF形式:可以确认音频数据的开始位置,不能从中间解码,无法随机访问,无法跳播,适合存储在磁盘中

        ADTS形式的AAC文件,可以在任何一帧开始解码,因为ADTS格式的每一帧都有头信息

        4.1ADIF的数据结构

        

        adif_header:adif的头部,一个adif形式的AAC文件只有一个头部

        

        byte_alignment:用于字节对齐

        因为每帧不是固定大小,故只能按照顺序进行解码,也无法跳播或快进快退。除非自己解码遍历整个文件建立每帧位置表。

      4.2ADTS的结构

      

 由上图可知一个ADTS的AAC一帧数据由两个部分组成,ADTS头部和AAC ES,AAC ES是AAC的裸流数据

ADTS Header由两部分组成,一部分是adts_fixed_header,另一部分是adts_variable_header

下面就详细的说一下这两部分。

  1.1adts_fixed_header

        

syncword:固定是0xFFF,代表一个ADTS帧的开始

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

layer:默认为0b00(二进制)

protection_absent:表示是否误码校验

profile:表示使用哪个级别的AAC,下面这个表格是profile的索引

Sample Frequence index:代表的时使用采样率下标,通过这个下标找到对应的采样率,如下图

private bit:私有位,编码的时候设置为0,解码的时候忽略这一位

channel configuration:声道数的配置,下面是声道数的配置表格

1单声道
2双声道
3三声道
4四声道
5五声道
6六声道
7八声道

copy:编码的时候设置为0,解码的时候忽略这一位

home:编码的时候设置成0,解码的时候忽略这一位

 1.2adts_varibale_header的表格如下

copyright_identificaion_bit:编码的时候设置为0

copyright_identifiction_start:编码的时候设置为0

aac_frame_length:ADTS帧的长度,包含ADTS头部和AAC es数据的长度,如果包含crc校验的话,ADTS头部的长度是9字节,不包含crc校验的话ADTS头部的长度就是7字节,所以aac_frame_length = (protection_absent == 0 ? 9:7) + audio_data_length

adts_buffer_fulness:固定为0x7FF,这个标识符是指可变码流

number_of_raw_data_blocks_in_frame:表示当前的帧有number_of_raw_data_blocks_in_frame+1个原始帧


http://www.mrgr.cn/news/20505.html

相关文章:

  • OpenObserve云原生可观测平台本地Docker部署与远程访问实战教程
  • 时钟分频流程
  • 岳阳市美术馆预约平台(小程序)论文
  • HTML 基础知识详解与代码示例
  • 集运代购业务前景广阔,如何选择合适的集运代购系统?
  • C++——继承
  • 【高等数学学习记录】集合
  • Docker打包镜像
  • log4j日志封装说明—slf4j对于log4j的日志封装-正确获取调用堆栈
  • Python | 使用Joblib模块加快任务处理速度
  • 多媒体应用设计师需要掌握多种软件
  • 网络编程9.5
  • 屎记·大夏王本纪
  • 【C++ Primer Plus习题】11.6
  • 苏宁易购发布公告 管理层提前超额完成增持计划
  • nginx中如何设置gzip
  • 【2024数模国赛题目解析丨免费分享】
  • 【PyTorch】基础环境如何打开
  • Java设计模式【备忘录模式】-行为型
  • 合并大量netcdf数据的代码