前言
网络上各种 FFMPEG,尤其是雷大神的一些样例,很好,但是一堆 deprecated 的API,编译看着是真心很烦。所以自己写了一个针对各种格式的输入音频,然后,也没复杂的功能,就是进行音频内部的一些检测。
说一说音频格式
关键的参数:
1. 采样率
2. 位深(说白了也就是精度)
现实生活中的声音其实是连续的,而到电脑,手机等设备中的音频是数字的,离散的。连续的数据是如何变成离散的呢,就是录音,就是采样过程。这么说太抽象了,假设一个例子:
我们现在来测一天的温度。怎么测?
第一:多久测一次?第二:温度计用什么样子的?刻度需要到什么样的精细程度?
假设:一个小时测量一次,温度计能够精确到0.1度。那么采样率就是 1 次/小时,当然,次不是个物理的计量单位,小时是时间计量单位,物理里面针对这种情况,引入了一个特别的单位,就是赫兹。1 小时负一次方,转换成秒的负一次方,就是具有标准单位的采样单位,赫兹了。精度,如果是精确到度,那么比如32度,31度,跟精确到0.1度,33.1度,31.3度,影响的就是存储数据的空间大小了,8bit长度的数字,16bit长度甚至是32bit长度的数字,能够表达的精度,是不一样的。这就是位深。
采样率是不是越高越好呢?测量温度为例:一分钟测一次,甚至一秒钟测量一次,是否有必要呢?其实完全没有必要,因为气温的变化,太慢,一分钟一次,完全没有必要,很可能很多时候测量的数据都是一样的。还有就是精度,精度太细,有没有必要呢?对于人体而言,低于0.1度的气温,人体根本感受不到。测量精细了有什么用呢?甚至到0.5度精度就足矣了。当然也不能太粗,那测量出来,跟没有温度计的估计是一样的效果,精度如果是10读,测量下来,20度,30度,20度,30度,也没啥特别的作用。
所以,对于音频,也一样,不同需求下的声音的录制,根据场景需要来进行采样的。
比如人声,也就是所谓的语音。语音录制,一般场景下,回放出来,只要能听懂,就OK。满足这种要求的情况下,8K的采样率一般足矣了,甚至个别场景下,采用6k的采样率。为什么是6k或者8k?因为人体说话的声音的固有震动频率一般都是3到4k之间。而且大多数人都是在3k左右,到4k的一般都很少。可想,画成波形,那么采样之后的数据回放,如何让人能够听懂呢?至少能尽量“恢复”成原来的样子呢?直观而言,至少在波峰处取一个点,波谷处取一个点,这样才能还原吧。当然,这种直观是不靠谱的。其实,如果了解傅里叶变换,知道频域时域这些知识,理论上是可以证明:4k固有震动频率的波形,采样必须要在4k*2的采样率以上,其实就是香农采样定理。还有就是位深,采样精度,跟温度精度其实也是类似的。
好,这下我们就知道了音频数据最关键的两个数据了,采样率跟位深。
对于语音,一般8k采样率,8bit采样位深也就足够了。但是为了更好的品质呢,一般都采用8k16bit的采样率跟位深。这样采集来的数据,就是所谓的PCM,也就是没有经过压缩的数据。其实WAV格式的音频,内部的数据,一般就是这样的数据,加了个格式头而已。
为什么会有所谓的44100采样率?因为前文说的是语音,就是人说话,那唱歌呢?乐器呢?经过反复试验,发现采样率到了44100的时候,再往上,不好意思,放出来的声音,人耳朵已经分辨不出其中的差距了。所以,一般的44100就是音频采样的最高