【秒懂音视频开发】14_AAC编码
AAC(Advanced Audio Coding,译为:高级音频编码),是由Fraunhofer IIS、杜比实验室、AT&T、Sony、Nokia等公司共同开发的有损音频编码和文件格式。
对比MP3
AAC被设计为MP3格式的后继产品,通常在相同的比特率下可以获得比MP3更高的声音质量,是iPhone、iPod、iPad、iTunes的标准音频格式。
AAC相较于MP3的改进包含:
- 更多的采样率选择:8kHz96kHz,MP3为16kHz48kHz
- 更高的声道数上限: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的发展历程。


LC
LC适合中等比特率,比如96kbps~192kbps之间。
MPEG-4 AAC LC等价于:
- MPEG-2 AAC LC + 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是瑞典是一家技术公司
- 在2007年,被杜比实验室(Dolby Laboratories)以2.5亿美元收购
MPEG-4 AAC HE v1等价于:
- MPEG-4 AAC LC + SBR

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

PS(Parametric Stereo)译为:参数立体声。
- 是一种有损的音频压缩算法,可以进一步提高压缩率
- 可以将左右声道信号组合成单声道信号,声道之间的差异信息存储到少量的PS data中(大概占2~3kbps)
- 解码器可以根据PS data中恢复出立体声信号
编解码器
如果想对PCM数据进行AAC编码压缩,那么就要用到AAC编码器(encoder)。
如果想将AAC编码后的数据解压出PCM数据,那么就要用到AAC解码器(decoder)。
这里只列举几款常用的AAC编解码器:
-
- 支持LC/HE规格
- 目前已经停止开发维护
FFmpeg AAC
- 支持LC规格
- FFmpeg官方内置的AAC编解码器,在libavcodec库中
FAAC(Freeware Advanced Audio Coder)
- 支持LC规格
- 可以内置到FFmpeg中,名字叫做libfaac
- 从2016年开始,FFmpeg已经移除了对FAAC的支持
-
- 支持LC/HE规格
- 目前质量最高的AAC编解码器
- 可以内置到FFmpeg中,名字叫做libfdk_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。这里给出2个解决方案:
- 下载内置了libfdk_aac的FFmpeg
- 这个版本不一定能找到
- 因为网上流传的FFmpeg基本都是不带libfdk_aac的,除非有某位热心的网友刚好上传了这个版本
- 自己手动编译FFmpeg源码,将libfdk_aac内置到FFmpeg中
- 这是推荐的方案
- 自己手动编译的话,想内置啥就内置啥
- 可以把你想要的东西都塞到FFmpeg中,不想要的就删掉
- 也就是根据自己的需要对FFmpeg进行裁剪
【秒懂音视频开发】14_AAC编码的更多相关文章
- 【秒懂音视频开发】02_Windows开发环境搭建
音视频开发库的选择 每个主流平台基本都有自己的音视频开发库(API),用以处理音视频数据,比如: iOS:AVFoundation.AudioUnit等 Android:MediaPlayer.Med ...
- 【秒懂音视频开发】23_H.264编码
本文主要介绍一种非常流行的视频编码:H.264. 计算一下:10秒钟1080p(1920x1080).30fps的YUV420P原始视频,需要占用多大的存储空间? (10 * 30) * (1920 ...
- 【秒懂音视频开发】26_RTMP服务器搭建
从本节开始,正式开启流媒体相关的内容. 流媒体 基本概念 流媒体(Streaming media),也叫做:流式媒体. 是指将一连串的多媒体数据压缩后,经过互联网分段发送数据,在互联网上即时传输影音以 ...
- 【秒懂音视频开发】18_详解YUV
本文的主角是多媒体领域非常重要的一个概念:YUV. 简介 YUV,是一种颜色编码方法,跟RGB是同一个级别的概念,广泛应用于多媒体领域中. 也就是说,图像中每1个像素的颜色信息,除了可以用RGB的方式 ...
- 【秒懂音视频开发】05_Qt开发基础
控件的基本使用 为了更好地学习Qt控件的使用,建议创建项目时先不要生成ui文件. 打开mainwindow.cpp,在MainWindow的构造函数中编写界面的初始化代码. 窗口设置 MainWind ...
- 【秒懂音视频开发】12_播放WAV
对于WAV文件来说,可以直接使用ffplay命令播放,而且不用像PCM那样增加额外的参数.因为WAV的文件头中已经包含了相关的音频参数信息. ffplay in.wav 接下来演示一下如何使用SDL播 ...
- 【秒懂音视频开发】21_显示BMP图片
文本的主要内容是:使用SDL显示一张BMP图片,算是为后面的<播放YUV>做准备. 为什么是显示BMP图片?而不是显示JPG或PNG图片? 因为SDL内置了加载BMP的API,使用起来会更 ...
- Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)
本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...
- Android IOS WebRTC 音视频开发总结(五七)-- 网络传输上的一种QoS方案
本文主要介绍一种QoS的解决方案,文章来自博客园RTC.Blacker,欢迎关注微信公众号blacker,更多详见www.rtc.help QoS出现的背景: 而当网络发生拥塞的时候,所有的数据流都有 ...
随机推荐
- CSS3 & transition & animation
CSS3 & transition & animation https://developer.mozilla.org/en-US/docs/Web/CSS/transition-ti ...
- uni-app小白入门自学笔记(二)
码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14429616.html 目录 码文不易啊,转载请带上本文链接呀,感谢感谢 https ...
- Java自学第8期——多线程
1.多线程: 操作系统支持同时运行多个任务,一个任务通常是一个程序,所有运行中的程序就是一个进程().程序内部包含多个顺序执行流,每个顺序执行流就是一个线程. 并发:两个或者多个事件在同一个时间段内交 ...
- 鸿蒙js开发7 鸿蒙分组列表和弹出menu菜单
鸿蒙入门指南,小白速来!从萌新到高手,怎样快速掌握鸿蒙开发?[课程入口]目录:1.鸿蒙视图效果2.js业务数据和事件3.页面视图代码4.跳转页面后的视图层5.js业务逻辑部分6.<鸿蒙js开发& ...
- RabbitMQ基础教程
目录 RabbitMQ相关概念介绍 生产者和消费者 队列 交换器.路由键.绑定 交换器类型 RabbitMQ运转流程 AMQP协议介绍 AMQP生产者流转过程 AMQP消费者流转过程 安装Rabbit ...
- Python基础语法函数
函数是什么 Python中的函数与数学中的函数不同,它不再只是公式,而是实实在在有着自己特定功能的代码.其实在潜移默化中我们已经有所接触了. 比如print()函数,range()函数,type()函 ...
- NPOI 在指定单元格导入导出图片
NPOI 在指定单元格导入导出图片 Intro 我维护了一个 NPOI 的扩展,主要用来导入导出 Excel 数据,最近有网友提出了导入 Excel 的时候解析图片的需求,于是就有了本文的探索 导入E ...
- 剑指 Offer 19. 正则表达式匹配 + 动态规划
剑指 Offer 19. 正则表达式匹配 题目链接 一. 字符串匹配大致可以分为三种情况: 第一种:正则串的最后一个字符为正常字符,此时根据主串的最后一个字符是否和它相同来判断是否匹配, 如果相同,则 ...
- [数据结构与算法-15]单源最短路径(Dijkstra+SPFA)
单源最短路径 问题描述 分别求出从起点到其他所有点的最短路径,这次主要介绍两种算法,Dijkstra和SPFA.若无负权优先Dijkstra算法,存在负权选择SPFA算法. Dijkstra算法 非负 ...
- javaweb遇到的报错及解决方式
javaweb报错问题以及解决方案 问题(报错信息):Application Server was not connected before run configuration stop, reaso ...