后续要开始做一些音频相关的内容
在此记录一些基础的音频知识吧
人耳可以听到的声音频率在20HZ~20kHz之间的声波,称为音频。
音频采样,是把声音从模拟信号转换为数字信号
参考
一些基础参数
- 采集音频的时候会涉及到一些采集参数,比如说:采样频率,采样深度,通道数,在此简单介绍一下
采样频率
采样设备(麦克风)每秒进行的采样次数(每台电脑的麦克风都有固定的采样频率),同样也是所得的数字信号的每秒样本数。
人耳可以听到的频率为 20 hz - 20k hz 之间
采样频率越高,声音的质量也就越好,声音的还原也就越真实,但同时它占的资源比较多。由于人耳的分辨率很有限,太高的频率并不能分辨出来。
- 8000 Hz - 电话所用采样率, 对于人的说话已经足够
- 11025 Hz - AM调幅广播所用采样率
- 22050 Hz 和 24000 Hz - FM调频广播所用采样率
- 32000 Hz - miniDV 数码视频 camcorder、DAT (LP mode)所用采样率
- 44100 Hz - 音频 CD, 也常用于 MPEG-1 音频(VCD, SVCD, MP3)所用采样率
- 47250 Hz - 商用 PCM 录音机所用采样率
- 48000 Hz - miniDV、数字电视、DVD、DAT、电影和专业音频所用的数字声音所用采样率
- 50000 Hz - 商用数字录音机所用采样率
- 96000 或者 192,000 Hz - DVD-Audio、一些 LPCM DVD 音轨、BD-ROM(蓝光盘)音轨、和 HD-DVD (高清晰度 DVD)音轨所用所用采样率
- 2.8224 MHz - Direct Stream Digital 的 1 位 sigma-delta modulation 过程所用采样率。
如果是双声道(stereo), 采样就是双份的, 文件也差不多要大一倍。
采样位数
- 音频在经过采样得到样本后,还需要对该样本执行两个步骤:
- 量化。音频量化的
量化位数
常用的有:
-8bit (也就是1字节) 只能记录 256 个数, 也就是只能将振幅划分成 256 个等级;- 16bit (也就是2字节) 可以细到 65536 个数, 这已是 CD 标准了;
- 32bit (也就是4字节) 能把振幅细分到 4294967296 个等级, 实在是没必要了.
- 量化位数又叫做采样位数、位深度、分辨率, 它是指声音的连续强度被数字表示后可以分为多少级。N-bit的意思声音的强度被均分为2^N级。16-bit的话,就是65535级。这是一个很大的数了,人可能也分辨不出六万五千五百三十五分之一的音强差别。也可以说是声卡的分辨率,它的数值越大,分辨率也就越高,所发出声音的能力越强。这里的采样倍数主要针对的是信号的强度特性,采样率针对的是信号的时间(频率)特性这是两个不一样的概念。
- 二进制编码。也就是把量化所得的结果,即单个声道的样本,以二进制的码字进行存放。其中有两种存放方式:
- 直接以整形来存放量化结果,即Two’s complement code;
- 以浮点类型来存放量化结果,即Floating point encoding code。
大多数格式的PCM(脉冲编码调制 - Pulse Code Modulation,PCM)样本数据使用整形来存放,而在对一些对精度要求高的应用方面,则使用浮点型来表示PCM 样本数据
通道数
即声音的通道的数目,一般分为单声道和双声道 可以理解为在声音采集时从一个点进行收集,双声道从两个点进行收集
常有单声道和立体声之分,单声道的声音只能使用一个喇叭发声(有的也处理成两个喇叭输出同一个声道的声音),立体声可以使两个喇叭都发声(一般左右声道有分工) ,更能感受到空间效果,当然还有更多的通道数。
帧
- 音频在量化得到二进制的码字后,需要进行变换,而变换(MDCT)是以块为单位(block)进行的,一个块由多个(120或128)样本组成。而一帧内会包含一个或者多个块。帧的常见大小有960、1024、2048、4096等。一帧记录了一个声音单元,它的长度是样本长度和声道数的乘积。FFmpeg中 AVFrame 结构体中的 nb_samples 代表的就是一帧中单个声道的音频样本数量。
样本的组合方式
- 这个主要是针对双声道或多声道音频来说的,对于一个双声道音频来说,它的组合方式可能有以下两种:
- 交错(interleaved)。以stereo为例,一个stereo音频的样本是由两个单声道的样本交错地进行存储得到的。
- 平面(planar)。各个声道的样本分开进行存储。
- FFmpeg音频解码后的数据是存放在AVFrame结构中的。
- Packed格式,frame.data[0]或frame.extended_data[0]包含所有的音频数据中。
- Planar格式,frame.data[i]或者frame.extended_data[i]表示第i个声道的数据(假设声道0是第一个), AVFrame.data数组大小固定为8,如果声道数超过8,需要从frame.extended_data获取声道数据。
比特率
每秒的传输速率(位速, 也叫比特率)。如705.6kbps 或 705600bps, 其中的 b 是 bit, ps 是每秒(per second)的意思,表示每秒705600bit的容量。压缩的音频文件常常用倍速来表示,譬如达到CD音质的MP3是128kbps/44100HZ。注意这里的单位是bit而不是Byte,一个Byte等于8个bit(位),bit是最小的单位,一般用于网络速度的描述和各种通信速度,Byte则用于计算硬盘,内存的大小。
- Mbps 即:Milionbit per second(百万位每秒);
- Kbps 即: Kilobit per second(千位每秒);
- bps 即:bit per second (位每秒), 相应的换算关系为:
1Milionbit=1000Kilobit=1000000bit;1Mbps = 1000 000bps; 再次强调这里是速度单位,指每秒传输的二进制位数,数据传输速率的衡量单位K是十进制含义,但数据存储的K是二进制含义。例如:
通常描述的1M带宽就是1Mbps = 1000 000 bps = 1000 000 / 8 / 1000 = 125; 所以1M带宽的下载速率一般不超过125KB/s
100M宽带也就是100 000 000bps = 100 000 000 / 8 / 1000 / 1000 = 12.5, 所以100M带宽的下载速率最大可达到12.5MB/s
当然了,以上只是理论速率,实际上最大的下载速率可能还达不到那么多,主要还会受到各种损耗的影响,一般100MB宽带下载速率能达到10MB就算不错了。
采样率、采样位数、比特率三者之间的关系
例:根据一个文件的大小推算出文件时长
譬如 “Windows XP 启动.wav” 的文件长度是 424,644 字节, 它是 “22050HZ / 16bit / 立体声” 格式(这可以从其 “属性->摘要” 里看到),
那么它的每秒的传输速率(位速, 也叫比特率、取样率)是 22050162 = 705600(bit/s), 换算成字节单位就是 705600/8 = 88200(字节/秒),
播放时间:424644(总字节数) / 88200(每秒字节数) ≈ 4.8145578(秒)。但是这还不够精确, 包装标准的 PCM 格式的 WAVE 文件(*.wav)中至少带有 42 个字节的头信息, 在计算播放时间时应该将其去掉,
所以就有:(424644-42) / (22050162/8) ≈ 4.8140816(秒). 这样就比较精确了。也就是:
- (文件总大小 - 头信息)/ (采样率 * 采样位数 * 通道数 / 8) [也就是比特率] ≈ 文件时长。