【FFmpeg实战】AAC编码介绍

news2024/11/26 2:55:07

AAC(Advanced Audio Coding,译为:高级音频编码),是由Fraunhofer IIS、杜比实验室、AT&T、Sony、Nokia等公司共同开发的有损音频编码和文件格式。

对比MP3

AAC被设计为MP3格式的后继产品,通常在相同的比特率下可以获得比MP3更高的声音质量,是iPhone、iPod、iPad、iTunes的标准音频格式。

AAC相较于MP3的改进包含:

  • 更多的采样率选择:8kHz ~ 96kHz,MP3为16kHz ~ 48kHz
  • 更高的声道数上限:48个,MP3在MPEG-1模式下为最多双声道,MPEG-2模式下5.1声道
  • 改进的压缩功能:以较小的文件大小提供更高的质量
  • 改进的解码效率:需要较少的处理能力进行解码

规格

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)

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

LC和HE

虽然上面列举了9种规格,但我们目前只需要把注意力放在常用的LC和HE上。下图很好的展示了从LC到HE的发展历程。

img

img

LC

LC适合中等比特率,比如96kbps ~ 192kbps之间。

MPEG-4 AAC LC等价于:

  • MPEG-2 AAC LC + PNS

PNS(Perceptual Noise Substitution)译为:感知噪声替代。

  • PNS可以提高AAC的编码效率

HE

HE有v1和v2两个版本,适合低比特率:

  • v1:适合48kbps ~ 64kbps
  • v2:适合低于32kbps,可在低至32kbps的比特率下提供接近CD品质的声音

v1

MPEG-4 AAC HE v1的别名:

  • aacPlus v1
  • eAAC
  • AAC+
  • CT-aacPlus(Coding Technologies)
  • Coding Technologies是瑞典是一家技术公司,率先在AAC中使用了SBR技术
  • 在2007年,被杜比实验室(Dolby Laboratories)以2.5亿美元收购

MPEG-4 AAC HE v1等价于:

  • MPEG-4 AAC LC + SBR

img

SBR(Spectral Band Replication)译为:频段复制。

  • 是一种增强的压缩技术
  • 可以将高频信号存储在少量的SBR data中
  • 解码器可以根据SBR data恢复出高频信号

v2

MPEG-4 AAC HE v2的别名:

  • aacPlus v2
  • AAC++
  • eAAC+、Enhanced AAC+

MPEG-4 AAC HE v2等价于:

  • MPEG-4 AAC HE v1 + PS

img

PS(Parametric Stereo)译为:参数立体声。

  • 是一种有损的音频压缩算法,可以进一步提高压缩率
  • 可以将左右声道信号组合成单声道信号,声道之间的差异信息存储到少量的PS data中(大概占2 ~ 3kbps)
  • 解码器可以根据PS data中恢复出立体声信号

编解码器

如果想对PCM数据进行AAC编码压缩,那么就要用到AAC码器(encoder)。 如果想将AAC编码后的数据解压出PCM数据,那么就要用到AAC码器(decoder)。

这里只列举几款常用的AAC编解码器:

  • Nero AAC

  • 支持LC/HE规格

  • 目前已经停止开发维护

  • FFmpeg AAC

  • 支持LC规格

  • FFmpeg官方内置的AAC编解码器,在libavcodec库中

  • 编解码器名字叫做aac

  • 在开发过程中通过这个名字找到编解码器

  • FAAC(Freeware Advanced Audio Coder)

  • 支持LC规格

  • 可以集成到FFmpeg的libavcodec中

  • 编解码器名字叫做libfaac

  • 在开发过程中通过这个名字找到编解码器,最后调用FAAC库的功能

  • 从2016年开始,FFmpeg已经移除了对FAAC的支持

  • Fraunhofer FDK AAC

  • 支持LC/HE规格

  • 目前质量最高的AAC编解码器

  • 可以集成到FFmpeg的libavcodec中

  • 编解码器名字叫做libfdk_aac

  • 在开发过程中通过这个名字找到编解码器,最后调用FDK AAC库的功能

编码质量排名:Fraunhofer FDK AAC > FFmpeg AAC > FAAC。

FDK AAC

在网上下载的编译版FFmpeg,通常都是没有集成libfdk_aac的。可以通过命令行查看FFmpeg目前集成的AAC编解码器。

# windows
ffmpeg -codecs | findstr aac
 
# mac
ffmpeg -codecs | grep aac

我这边的输出结果是:

DEAIL. aac                  AAC (Advanced Audio Coding) (decoders: aac aac_fixed )
D.AIL. aac_latm             AAC LATM (Advanced Audio Coding LATM syntax)

很显然,并没有包含libfdk_aac。

这里给出1个比较推荐的方案:自己手动编译FFmpeg源码,将libfdk_aac集成到FFmpeg中。

  • 自己手动编译的话,想集成啥就集成啥
  • 可以把你想要的东西都塞到FFmpeg中,不想要的就删掉
  • 也就是根据自己的需要对FFmpeg进行裁剪
>>> 音视频开发 视频教程: https://ke.qq.com/course/3202131?flowToken=1031864 
>>> 音视频开发学习资料、教学视频,免费分享有需要的可以自行添加学习交流群: 739729163  领取

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

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

相关文章

训练自己的ChatGPT 语言模型(一).md

0x00 Background 为什么研究这个? ChatGPT在国内外都受到了广泛关注,很多高校、研究机构和企业都计划推出类似的模型。然而,ChatGPT并没有开源,且复现难度非常大,即使到现在,没有任何单位或企业能够完全复…

Atlas200 DK A2与Arduino进行UART串口通信

我们在做一些人工智能的应用开发时往往使用人工智能开发板作为上位机(比如我们的小滕),Arduino、stm32等作为下位机控制板,通过上位机进行人工智能模型的推理之后进而给下位机传输对应的控制命令实现智能控制。那么如何实现两者的…

简化交互体验——探索Gradio的ClearButton模块

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

ndarray对象怎样创建?ndarray基本属性列举

numpy中包含一个N维数组对象,即ndarray对象,该对象具有矢量算术能力和复杂的广播能力,常用于科学计算。ndarray对象中的元素可以通过索引访问,索引序号从0开始;ndarray对象中存储的所有元素的类型必须相同。创建ndarray对象的方式…

输入框设置placeholder的文字居中

<input classlogin-form-pwd placeholder请输入商家登录密码 placeholder-class"center"></input> .center{ text-align: center; }

Linux下 MHA故障切换 主从角色提升

目录 所有主机共同操作 manger操作 其他四台安装 搭建主从复制环境 nobe slave1 配置 slave2 slave3 配置 配置MHA环境 简述MHA&#xff1a; MHA&#xff08;Master High Availability&#xff09;目前在MySQL高可用方面是一个相对成熟的解决方案&#xff0c;它由…

MySQL中的DDL操作,MySQL中DML操作,MySQL查询数据,SQL函数,MySQL中的索引,MySQL事务,MySQL的用户管理,MySQL分页查询

目录 MySQL中的DDL操作 一、创建表与删除表 1&#xff0c;创建表 2&#xff0c;查看已创建的表。 3&#xff0c;删除表 二、修改表 1&#xff0c;修改表名 2&#xff0c;修改列名 3&#xff0c;修改列类型 4&#xff0c;添加新列 5&#xff0c;删除指定列 三、MySQ…

劳保鞋厂家带你深入了解防静电安全鞋——百华劳保

静电小则电人&#xff0c;大则引起火灾。静电的能量虽然不大&#xff0c;但其易放电&#xff0c;会出现静电火花&#xff0c;在易燃易爆场所&#xff0c;可能因静电火花引起火灾和爆炸。现在的工厂不少都是要求穿着具有防静电性能的工作鞋&#xff0c;很多劳动者都会穿着防静电…

使用Docker Swarm部署RabbitMQ+HAProxy高可用集群(三节点-镜像模式)

1. 部署规划 当前规划中&#xff0c;只启动一个HAProxy服务&#xff0c;主要用来做RabbitMQ节点的负载均衡和代理&#xff0c;但是HAProxy可能会出现单点故障&#xff0c;后续需要启动多个HAProxy节点&#xff0c;然后结合Keepalived来进行 设置虚拟IP 做故障转移 节点名称节…

nvm安装nodejs-2023年6月29日

nvm安装nodejs-2023年6月29日 cmd命令行&#xff0c;执行如下代码&#xff0c;表示安装最新稳定版本的node,这里默认是国外的node节点服务器 nvm install lts报错的话&#xff0c;找到安装目录&#xff0c;打开settings.txt&#xff0c;添加如下代码 更换node的国内淘宝镜像节…

cnocr安装和识别文字

cnocr 介绍 参考&#xff1a; cnocr: 极简的中文OCR Python包 https://cnocr.readthedocs.io/zh/latest/ cnocr 主要针对的是排版简单的印刷体文字图片&#xff0c;如截图图片&#xff0c;扫描件等。目前内置的文字检测和分行模块无法处理复杂的文字排版定位。如果要用于场景…

《从零开始编写一个直播服务器》音视频封装FLV

流媒体服务系列文章 文章目录 流媒体服务系列文章前言一、FLV 封装格式解析二、实例分析总结 前言 一、FLV 封装格式解析 flv header flv body flv header previous size0 tag1 previous size1 tag2 … prvious sizen tagn1 flv header previous size0 tag1 header ta…

华为OD机试真题 Python 实现【获得完美走位】【2022Q4 200分】

一、题目描述 在第一人称射击游戏中&#xff0c;玩家通过键盘的 A、S、D、W 四个按键控制游戏人物分别向左、向后、向右、向前进行移动&#xff0c;从而完成走位假设玩家每按动一次键盘&#xff0c;游戏任务会向某个方向移动一步&#xff0c;如果玩家在操作一定次数的键盘并且…

经典文献阅读之--Wheel-SLAM(低成本轮式机器人定位算法)

0. 简介 最近随着越来越多的团队开始注重将SLAM应用在机器人和无人驾驶上&#xff0c;最近SLAM的顶刊顶会也开始想着多模态和低成本这两个方向开始发力。而本文讲的这个《Wheel-SLAM: Simultaneous Localization and Terrain Mapping Using One Wheel-mounted IMU》就是讲了如…

Scala中那些奇怪的符号

<- 运算符 用于 for 循环中&#xff0c;如下所示&#xff1a; for ( i <- arr ){println( "i" i ) } -> 只会用在 k->v 里面 // Map 键值对演示 val colors Map("red" -> "#FF0000", "azure" -> "#F0FF…

WPF 控件设置透明度的方法

方法一&#xff1a;通过 Opacity 属性设置背景色透明度。范围从0-1&#xff0c;0表示完全透明&#xff0c;看不见。 通过 Opacity 属性去改变控件透明度 会影响子控件的透明度&#xff0c;是因为Opacity属性是在UIElement 类(以及Brush基类)中定义&#xff0c;所有元素都具有该…

python分析QQ群聊天记录全过程,从获取到可视化

​ 随着社交媒体的兴起&#xff0c;QQ群成为了人们交流的重要平台&#xff0c;而提取这些数据可以帮助我们了解用户关注的重点和行为&#xff0c;那么如何获取QQ群聊天记录呢&#xff1f;如何对其进行处理并分析呢&#xff1f; 这是一套完整的流程&#xff0c;从选定的QQ群中…

2023最新版SpringCloudAlibaba笔记,把微服务玩的出神入化

SpringCloud Alibaba 大家都知道&#xff0c;新的东西出现必然是因为市场的需求。由于 SpringCloud 版本更新较快&#xff0c;日积月累之下产生了许多的 Bug&#xff0c;所以 SpringCloud 微服务实现方式&#xff1a;Spring Cloud Netflix 自然而然地进入了维护状态&#xff0…

java计算器拓展

源代码&#xff1a; package shixun; import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.JButton; import javax.swing.SwingConstants;import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.Font; impor…

Golang项目引入第三方依赖库

基本目录 第一步&#xff1a; 初始化依赖&#xff0c;切换到项目根目录下面&#xff0c;执行一下命令&#xff0c;g6 为 module 的名称 go mod init g6 生成 go.mod 文件 module g6 go 1.20 将来我们项目的所有依赖都会依赖于 g6 第二步&#xff1a; 引入第三方依赖 &qu…