音频编码格式介绍-AAC

2023-05-16

目录

  1. 概述

  2. 帧格式

  3. 算法简介

  4. 开源的软件

  5. AAC和MP3的关键性不同

  6. 参考阅读

1. 概述 AAC(Advanced Audio Coding),被认为是MP3的继任者,相对MP3有更高的压缩效率。由Fraunhofer IIS、杜比实验室、AT&T、Sony(索尼)等公司共同开发。1997年由MPEG正式宣布为国际标准,为MPEG-2标准的第7部分-ISO/IEC 13818-7:1997。MPEG-4标准中,AAC音频流部分在ISO/IEC 14496-3 (subpart 4)中规定。 AAC被iPhone、iTunes以及大多数便携式设备所使用。 AAC有很多的选项和profiles。 2. 帧格式 AAC音频格式有:

  • ADIF(Audio Data Interchage Format),音频数据交换格式:只有一个统一的头,必须得到所有数据后解码,适用于本地文件。

  • ADTS(Audio Data Transport Stream),音视数据传输流:每一帧都有头信息,任意帧解码,适用于传输流。

下面主要介绍ADTS。 ADTS的组成单元是ADTS Frame。

  • ADTS Frame由ADTS_Header和AAC ES组成。

  • ADTS_Header包含采样率、声道数、帧长度的信息。

  • ADTS头信息的长度是7个字节或9字节(有CRC的情况)。

ADTS_Header的可以分为以下三部分:

  • adts_fixed_header:每一帧的内容是不变的。

  • adts_variable_header:每一帧的内容是存在变化的。

  • crc:16bits,protection_absent字段为0时存在。

adts_fixed_header:

在MPEG-2 AAC中定义了3种profile:

  • MPEG-2 AAC Main

  • MPEG-2 AAC LC (Low Complexity)

  • MPEG-2 AAC SSR (Scalable Sampling Rate)

在MPEG-4 AAC中定义了6种profile:

  • MPEG-4 AAC Main

  • MPEG-4 AAC LC (Low Complexity)

  • MPEG-4 AAC SSR (Scalable Sample Rate)

  • MPEG-4 AAC LTP (Long Term Predicition)

  • MPEG-4 AAC LD (Low Delay)

  • MPEG-4 AAC HE (High Efficiency) AACPlusV1/V2(3GPP)

adts_variable_header:

 

​【免费分享】文章最后领取音视频资料

 

AAC ES部分说明

  1. 一个frame的原始数据包含1024个样本时间段的音频数据。

ffmpeg中添加ADTS头的代码,可以很清晰的了解ADTS头的结构:

static int adts_write_frame_header(ADTSContext *ctx,
                                   uint8_t *buf, int size, int pce_size)
{
    PutBitContext pb;

    unsigned full_frame_size = (unsigned)ADTS_HEADER_SIZE + size + pce_size;
    if (full_frame_size > ADTS_MAX_FRAME_BYTES) {
        av_log(NULL, AV_LOG_ERROR, "ADTS frame size too large: %u (max %d)\n",
               full_frame_size, ADTS_MAX_FRAME_BYTES);
        return AVERROR_INVALIDDATA;
    }

    init_put_bits(&pb, buf, ADTS_HEADER_SIZE);

    /* adts_fixed_header */
    put_bits(&pb, 12, 0xfff);   /* syncword */
    put_bits(&pb, 1, 0);        /* ID */
    put_bits(&pb, 2, 0);        /* layer */
    put_bits(&pb, 1, 1);        /* protection_absent */
    put_bits(&pb, 2, ctx->objecttype); /* profile_objecttype */
    put_bits(&pb, 4, ctx->sample_rate_index);
    put_bits(&pb, 1, 0);        /* private_bit */
    put_bits(&pb, 3, ctx->channel_conf); /* channel_configuration */
    put_bits(&pb, 1, 0);        /* original_copy */
    put_bits(&pb, 1, 0);        /* home */

    /* adts_variable_header */
    put_bits(&pb, 1, 0);        /* copyright_identification_bit */
    put_bits(&pb, 1, 0);        /* copyright_identification_start */
    put_bits(&pb, 13, full_frame_size); /* aac_frame_length */
    put_bits(&pb, 11, 0x7ff);   /* adts_buffer_fullness */
    put_bits(&pb, 2, 0);        /* number_of_raw_data_blocks_in_frame */

    flush_put_bits(&pb);

    return 0;
}

3. 算法简介 AAC是一种宽带音频编码算法,它利用两种主要的编码策略来大幅减少表示高质量数字音频所需的数据量:

  • 丢弃在感知上不相关的信号分量。

  • 消除了编码音频信号中的冗余。

实际的编码过程包括以下步骤:

  • 使用前向修改的离散余弦变换(MDCT)将信号从时域转换到频域。这是通过使用滤波器组来完成的,这些滤波器组采用适当数量的时间采样并将其转换为频率采样。

  • 基于心理声学模型量化频域信号并对其进行编码。

  • 添加内部纠错码。

  • 存储或传输信号。

  • 为了防止损坏的样本,将Luhn mod N算法的现代实现应用于每个帧。

算法部分更多介绍可参考[5]。 4. 开源软件

  • FAAD2:开源的MPEG-4和MPEG-2 AAC解码器。

  • fdk-aac:Fraunhofer IIS 开发的开源项目的aac编解码库,包含在android项目中。

5. AAC和MP3的关键性不同 AAC是在MP3基础上开发出来的,所以两者的编码系统有一些相同之处。但是对比一下两者的编码流程图,你会发现AAC的编码工序更为复杂。

  1. 滤波器组(Filter bank):

  2. 时域噪音修整(Temporal Noise Shaping,TNS):这项神奇的技术可以通过在频率域上的预测,来修整时域上的量化噪音的分布。在一些特殊的语音和剧烈变化信号的量化上,TNS技术对音质的提高贡献巨大!

  3. 预测(Prediction):对音频信号进行预测可以减少重复冗余信号的处理,提高效率。

  4. 量化(Quantization):AAC的量化过程是使用两个巢状循环进行反复运算。通过对量化分析的良好控制,比特率能够被更高效地利用。

  5. 比特流格式(Bit-stream format):在AAC中,信息的传输都要经过熵编码,以保证冗余尽可能少。此外AAC拥有一个弹性的比特流结构,使得编码效率进一步提高。

  6. 长时期预测(Long Term Prediction,LTP):这是一个MPEG-4 AAC中才有的工具,它用来减少连续两个编码音框之间的信号冗余,对于处理低码率的语音非常有效。

  7. 知觉噪音代替(Perceptual Noise Substitution,PNS):这也是MPEG-4 AAC中才有的工具,当编码器发现类似噪音的信号时,并不对其进行量化,而是作个标记就忽略过去,当解码时再还原出来,这样就提高了效率。

6. 参考

  •  雷霄华/视音频编解码学习工程:AAC格式分析器

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

音频编码格式介绍-AAC 的相关文章

随机推荐

  • 解决关闭deepin 15.11“自动索引内置磁盘”后仍然卡顿的问题

    关闭文件管理器中 自动索引内置磁盘 后 xff0c 查看iotop xff0c 已经没有占用磁盘的程序 xff0c 然而系统仍然卡顿 由于使用过程中听到磁盘频繁休眠 启动 xff1b 并且系统使用中卡死 以及待机后启动并卡死 xff0c 强
  • 打牌(求牌型方案数)

    问题描述 有 A B 张扑克牌 每张扑克牌有一个大小 整数 xff0c 记为a xff0c 范围区间是 0 到 A 1 xff09 和一个花色 xff08 整数 xff0c 记为b xff0c 范围区间是 0 到 B 1 扑克牌是互异的 x
  • 滑动窗口【区间最大值区间&最小值】【单调队列】

    问题描述 ZJM 有一个长度为 n 的数列和一个大小为 k 的窗口 窗口可以在数列上来回移动 现在 ZJM 想知道在窗口从左往右滑的时候 xff0c 每次窗口内数的最大值和最小值分别是多少 例如 xff1a 数列是 1 3 1 3 5 3
  • Q老师的考验【矩阵快速幂】【斐波那契数列】

    问题描述 Q老师 对数列有一种非同一般的热爱 xff0c 尤其是优美的斐波那契数列 这一天 xff0c Q老师 为了增强大家对于斐波那契数列的理解 xff0c 决定在斐波那契的基础上创建一个新的数列 f x 来考一考大家 数列 f x 定义
  • Q老师度假【动态规划dp】【矩阵快速幂优化】

    问题描述 忙碌了一个学期的 Q老师 决定奖励自己 N 天假期 假期中不同的穿衣方式会有不同的快乐值 已知 Q老师 一共有 M 件衬衫 xff0c 且如果昨天穿的是衬衫 A xff0c 今天穿的是衬衫 B xff0c 则 Q老师 今天可以获得
  • 插值算法[数学建模]

    插值 插值算法一维数据插值方法分段线性插值分段二次插值 xff08 分段抛物插值 xff09 拉格朗日插值法龙格现象 牛顿插值法埃尔米特插值法分段三次埃尔米特插值PCHIP 样条插值三次样条插值 n维数据插值应用 插值算法 在工程和数学应用
  • 时间序列【数学建模】

    时间序列 确定性时间序列分析方法移动平均法简单移动平均法加权移动平均法趋势移动平均法 指数平滑法一次指数平滑法二次指数平滑法三次指数平滑法 差分指数平滑法一阶差分指数平滑法二阶差分指数平滑法 具有季节性特点的时间序列的预测 平稳时间序列模型
  • UITabBarController的简单使用和属性方法总结

    一 引言 与导航控制器相类似 xff0c 标签控制器也是用于管理视图控制器的一个UI控件 xff0c 在其内部封装了一个标签栏 xff0c 与导航不同的是 xff0c 导航的管理方式是纵向的 xff0c 采用push与pop切换控制器 xf
  • 多元分析——聚类分析【数学建模】

    聚类分析 Q型聚类分析样本的相似性度量类与类间的相似性度量聚类图最短距离法的聚类举例Matlab 聚类分析的相关命令pdistlinkageclusterzsore X H 61 dendrogram Z P T 61 clusterdat
  • 多元分析——主成分分析【数学建模】

    主成分分析的主要目的是希望用较少的变量去解释原来资料中的大部分变异 xff0c 将许多相关性较高的变量转化为彼此相互独立或不相关的变量 通常是选出的比原始变量个数少 xff0c 能解释大部份资料中的变异的几个新变量 xff0c 即所谓主成分
  • Pytorch Resnet101

    Pytorch Resnet101 模型使用模板 模型 span class token string 34 34 span 34 model span class token operator span span class token
  • t-SNE可视化

    t SNE的全称是t Distributed Stochastic Neighbor Embedding xff0c 是一种降低维度的技术 xff0c 适用于将高维度数据可视化 它将数据点之间的相似性转换为联合概率 xff0c 并试图最小化
  • ubuntu下为apt-get设置代理

    debian mint都可以按此设置 xff08 debian系均可 xff0c 直接基于debian或间接基于debian的 xff09 现在公司很多都是通过代理上网的 xff0c 通过代理上网apt get install无法通网络进行
  • 开源虚拟化集群管理平台ProxmoxVE-安装介绍以及PCI直通和嵌套虚拟化说明

    说明 xff1a 当前测试环境为PVE7 0版本 官网 xff1a Proxmox Powerful open source server solutions 目录 背景 安装系统 PCI直通配置 xff08 开启iommu xff09 允
  • qt Linux arm 交叉编译

    1 操作系统 ubuntu1 20 04 2 qt5 9 9 Index of archive qt 5 9 5 9 9 下载qt源码 qt everywhere opensource src 5 9 9 tar xz 和程序 qt ope
  • 三角函数:图像和性质关系

    紧接上一篇 xff1a http blog csdn net yinhun2012 article details 79377728 这次我们通过函数图文和unity程序来观察三角函数的图像 xff0c 首先从基本的来 xff1a 1 f
  • Linux 每天定时关机 设置

    sudo gedit etc crontab 输入密码后 xff0c 在该文件插入一行 50 02 root sbin shutdown h now 保存后 xff0c 系统会在每天02 50 自动关机
  • anaconda如何配置环境变量

    anaconda安装好后 xff0c 在cmd输入conda xff0c 显示 xff1a conda 不是内部或外部命令 xff0c 也不是可运行的程序 或批处理文件 原因是 xff1a anaconda没有配置环境变量 那接下来我就教大
  • Windows下用 Code blocks + mingw 搭建 Fortran 编译环境

    方法一 xff1a 下载页面 xff1a http www codeblocks org downloads binaries 下载 codeblocks 17 12mingw fortran setup exe 这样的版本 方法二 xff
  • 音频编码格式介绍-AAC

    目录 概述 帧格式 算法简介 开源的软件 AAC和MP3的关键性不同 参考阅读 1 概述 AAC xff08 Advanced Audio Coding xff09 xff0c 被认为是MP3的继任者 xff0c 相对MP3有更高的压缩效率