热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

音频压缩

音频压缩消除冗余信息-20HZ以下,2万HZ以上的数据人不敏感,属于无效有损压缩无损压缩音频有损压缩音频冗余信息音频压缩技术是在保证信号在听觉方面不
音频压缩

消除冗余信息 - 20HZ以下,2万HZ以上的数据人不敏感,属于无效 有损压缩

无损压缩


音频有损压缩

音频冗余信息

音频压缩技术是在保证信号在听觉方面不失真的前提下,对音频数据信号进行尽可能大的压缩。

压缩的主要方法是去除采集到的音频荣冗余信息。所谓冗余信息包括人耳听觉范围外20HZ~2万HZ的音频信号以及被掩盖掉的音频信号。

信号的遮蔽可以分为频域遮蔽和时域遮蔽

在这里插入图片描述

频域遮蔽效应即简单来说就是在频率相近的情况下,强度大的遮蔽强度小的,但是无法遮蔽频率不相近的,哪怕是强度明显大于其强度

在这里插入图片描述

时域遮蔽效应,即强度大的会遮蔽前后一定时间内其他小强度的声音。

音频无损压缩

熵编码-代指无损编码


哈夫曼编码->用很小的一串0和1的二进制数代替一个特别长的字符,用小的代替长的,频率越高的编码越小,频率越低的编码越长


算术编码->通过二进制的小数进行编码


香农编码->算术编码就是在香农编码的基础上改进而来的

在这里插入图片描述

在这里插入图片描述

时域转频域变换:将时域一块长时间的数据交给模块转换为频域,转换成多种频段的数据,便于拆出哪些是需要的数据,哪些是不需要的。

心理声学模型:去掉20HZ~2万HZ之外的,以及一些被遮蔽的声音

常见的音频编码器

常见的音频编码器包括OPUSAAC、Ogg、Speex、iLBC、AMR、G.711等

OPUS:在线教育、音视频会议常用,延迟小压缩率高等优点,近些年比较突出。OPUS是较新的音编码器,WebRTC中默认使用。

AAC:目前应用最广泛的编解码器,用于IOS、安卓系统、嵌入式设备等都包含了硬件的AAC编解码,ffmpeg中也有很多的AAC编解码器。AAC在直播系统中应用广泛。

Ogg:收费,应用不是太广泛

Speex:在OPUS和AAC出现前使用广泛,有一个很好的优点,包括了回音消除的功能。

G.711:一般用于固话,窄带音频,编解码后的数据非常小,但是声音损耗严重

网上评测结果:OPUS > AAC > Ogg

在这里插入图片描述

纵轴是质量,横轴是码流大小

在这里插入图片描述

纵轴是延迟性,横轴是码率

AAC编码器介绍

AAC介绍

AAC(Advanced Audio Coding)由Fraunhofer IIS、杜比实验室、AT&T、Sony等公司共同研发,目的是取代MP3格式。

最开始是基于MPEG-2的音频编码技术,MPEG-4标准出现后,AAC重新集成了其特性,加入了SBR和PS技术。

目前常用的规格有AAC LC、AAC HE V1、AAC HE V2

在这里插入图片描述

图中蓝色的AAV HE V2 是误笔,实际上是AAC HE V2

AAC 规格描述

AAC LC:(Low Complexity)低复杂度规格,码流是128k,音质好。

AAC HE :等于AAC LC + SBR(Spectral Band Replication)。其核心思想是按频谱分开保存,低频编码保存主要成分,高频单独放大编码保存音质。码流在64k左右。

AAC HE V2:等于AAC LC + SBR + PS(Parametric Stereo)。其核心思想是双声道中的声音存在某种相似性,只需存储一个声道的全部信息,然后花很少的字节用参数描述另一个声道和她不同的地方。

AAC格式


ADIF(Audio Data Interchange Format)

这种格式的特征是可以确定的找到这个音频数据的开始,只能从头开始解码,不能在音频数据流中开始。这种格式常用在磁盘文件中。

相当于AAC数据加了一个头,解码AAC文件时先对头进行解析,拿到所有的参数信息,通过参数进行解码

ADTS(Transport Stream)

这种流的格式特征是每一帧都有一个同步字,所以可以在音频流的任何位置开始解码。它类似于数据流格式。

二者最本质的区别在于,ADIF只可以从头播放,如果播放前进行拖拽进度,或者中间进行拖拽进度,由于找不到头信息,会无法播放,但是ADTS因为每一帧都有同步字,所以拖拽后可以向后寻找头信息进行播放。

ADTS结构

在这里插入图片描述

Audio Object Types

1:AAC Main

2:AAC LC

5:SBR

29:PS

序号从1开始,真正编码中要减一

所以从数据中读出来数字1时要加一,即取2,也就是AAC LC,这是因为解析的数据是经过处理的,而在处理时做了减一操作,所以要在此进行复原。

Sampling Frequecy Index


  • 0:96000 Hz

  • 1:88200Hz

  • 2:64000Hz

  • 3:48000Hz

  • 4:44100Hz

  • 5:32000Hz

  • 6:24000Hz

  • 7:22050Hz

  • 8:16000Hz

  • 9:12000Hz

  • 10:11025Hz

  • 11:8000Hz

  • 12:7350Hz

  • 13:Reserved

  • 14:ReservedHz

  • 15:frequency is written explictly

    工具解析网址:http://www.p23.nl/projects/aac-header/

在这里插入图片描述

这是一个在线解析ADTS头的网址,输入头进行解析。

在实际使用中ADTS这类的头在ffmpeg中有相应的API使用,也可以ffmpeg全线接管

通过ffmpeg命令生成AAC文件

如下命令:

ffmpeg -i xxx.mp4

​ -vn -c:a libfdk_aac

​ -ar 44100 -channels 2 -profile:a aac_he_v2 3.aac

参数:

-i-> 输入多媒体文件,一定要包含音频数据,因为要获取aac,并重新编码

-vn-> v代表vedio,n代表no,-vn过滤视频

-c->代表codec,即编码,a代表audio即使用音频编码器 指定音频编码器libfdk_aac,libfdk_aac是当前众多aac编解码器中性能最好的

-ar->代表代表音频采样率

-channels->代表双声道,即左右声道

-profile->对libfdk_aac编解码器设置一些参数,在profile中指定a即对音频的设置,设置为aac_he_v2,也可以直接设为aac_he_v1、aac

最后输出aac文件名xxx.aac

ffmpeg的音频编解码器参数参考网址:

http://ffmpeg.org/ffmpeg-codecs.html#libfdk_005faac


推荐阅读
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了在Cpp中将字符串形式的数值转换为int或float等数值类型的方法,主要使用了strtol、strtod和strtoul函数。这些函数可以将以null结尾的字符串转换为long int、double或unsigned long类型的数值,且支持任意进制的字符串转换。相比之下,atoi函数只能转换十进制数值且没有错误返回。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了多因子选股模型在实际中的构建步骤,包括风险源分析、因子筛选和体系构建,并进行了模拟实证回测。在风险源分析中,从宏观、行业、公司和特殊因素四个角度分析了影响资产价格的因素。具体包括宏观经济运行和宏经济政策对证券市场的影响,以及行业类型、行业生命周期和行业政策对股票价格的影响。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • 本文介绍了关于Java异常的八大常见问题,包括异常管理的最佳做法、在try块中定义的变量不能用于catch或finally的原因以及为什么Double.parseDouble(null)和Integer.parseInt(null)会抛出不同的异常。同时指出这些问题是由于不同的开发人员开发所导致的,不值得过多思考。 ... [详细]
  • 移动–镜像y轴的视频文件剪辑原文:https://www. ... [详细]
  • 当程序到后台后,继续完成LongRunning Task 任务
    原文:http:blog.sina.com.cnsblog_7b9d64af0101cjci.html(2013-04-0921:27:24)我们知道, ... [详细]
author-avatar
daoyuanzhi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有