零、写在前面
想要了解音频首先要了解它的构造,知道它怎么从声音变成文件,又怎么从文件变成声音。文件格式根据需求和技术的进步有了不同的版本,不同的文件格式有其不同的文件构造。我们先从最原始的两种音频文件入手,讲一讲常见的音频文件格式。首先是PCM和WAV
一、PCM文件
PCM(Pulse-code modulation 脉冲编码调制)是音频原始数据,是采样器(麦克风)电信号转化的数字信号,这就是我们常说的采样到量化的过程,所以其实PCM不仅仅可以用在音频录制方面,它可用在其它电信号转数字信号的所有场景。由这样一段原始数据组成的音频文件叫PCM文件,以.PCM结尾。一个PCM文件的大小取决于以下几个元素:
1.1、格式和参数
采样率:是指每秒电信号采集数据的频率,常见的音频采样率有8000HZ,16000HZ,44100HZ,48000HZ,96000HZ等。
采样位深:表示每个电信号用多少位来存储,例如8位的采样位深能够划为的等级位256份,人耳的可识别声音频率为20-20000hz,那么每个位的误差就达到了80HZ,这对音频的还原度大幅降低,但是它的大小相应的也减小了,更有利于音频传输。早期的电话就使用的比较低的采样率来达到更稳定的通话质量。如果16位位深就能精准采样每一HZ。对于采样位深其实也并没有简单的8位/16位/32位这么简单,对于计算机来讲16位既可以用short表示也可以用16位int表示,32位既可以用32位int表示也可以用32位float表示,除此之外还有有符号和无符号之分,所有对于在编解码的时候对于这个我们也需要注意。
采样通道:常见的有单通道还是双通道,双通道能帮我们区分左右耳的声音,单通道的话两只耳朵都是一样的声音。通常我们追求立体感会使用双通道,所以双通道采集的声音也叫立体声。除此之外还有要求更高的2.1,5.1,6.1,7.1,等等通道类型,这些对你录制音频的麦克风有一定要求。
数据存储方式:表明数据是以交叉方式存放还是以分通道的方式存放,交叉排列只针对的是多通道的音频文件,单通道的音频文件不存在交叉排列。采样通道和数据存储方式决定数据具体如何存储。
那么从上可知生成一个1S的PCM文件所需要占磁盘的大小:
采样率*采样位数*通道数 单位为bit
那么其实算出来的结果也就是我们的比特/秒=比特率
那么我们生成一段时长为10S,采样率44100hz,采样位数为16位,通道数为两位的PCM文件所要占的磁盘大小(单位bit)为:44100*16*2*10。
虽说PCM是音频的源数据但是大多的播放器都无法播放它,因为它只有数据,播放器无从得知要怎么解析它,就算是PCM播放器也要事先指定它的采样率、通道数、和采样位数、以及字节序才能正确的播放(将数字信号转化为电信号)。
所以有了我们常见的几种音频格式WAV/MP3/AAC。当然这些音频格式的出行不仅仅是为了解决存放音频基本信息的问题,像MP3和AAC的目的更多的是压缩数据,在尽量保证质量的前提下,减小文件占用空间,达到更好的传输和存储效果。在这之前先说一说和PCM十分接近的音频文件WAV。
1.2、字节序
我们在录制PCM的时候其实也需要关注无关文件质量,很简单但是又非常重要的东西:字节序。字节序当然不仅仅在音频上,对于一些计算机相关数据交互/存储/通信协议上都是一个需要注意的点,字节序分为大端序和小端序两种,大端序是人更易读的顺序,小端序是电脑更易读的顺序。例如一个数据为0x01234567,那它的大端序为0x01234567 小端序为0x67452301,其实就是把字节位置倒过来放置。
二、WAV
2.1、格式和参数
WAV完全可以说它只解决了PCM数据没有存储录制格式的问题,解决办法也相当简单粗暴,直接在PCM的头部加上录制格式的信息,这些信息占用固定的44字节。所以WAV占用空间上非但没有比PCM数据小,反而大出44个字节,让我们看看这44字节到底放了些什么东西。我们以 采样率为44100,采样位数16,双通道,时长10S的PCM文件转WAV为例。先算出PCM文件大小:44100*16*2*10=14112000bit=176000byte,当然实际应用中我们也可以读取文件长度获得。
所属块 |
position |
名称 |
大小(byte) |
字节序 |
描述 |
内容 |
RIFF块 |
0-3 |
ID |
4 |
大端 |
固定内容'RIFF'ASCALL码 |
0x52494646 |
4-7 |
Size |
4 |
小端 |
整个文件长(包括头部44)减去ID和Szie大小,其实就是-8 |
数据为176000+44-8=176036 大端序:0x0002AFA4 小端序:0xA4AF0200 |
|
8-11 |
type |
4 |
大端 |
固定内容'WAVE' |
0x57415645 |
|
Format块 |
12-15 |
ID |
4 |
大端 |
固定内容'fmt ',注意最后一个字节未空格(全ASCALL) |
0x666d7420 |
16-19 |
SIZE |
4 |
小端 |
该区块(非总文件)长度-ID和Size长度 |
区块长35-11=24数据长24-8=16 大端序:0x0010 小端序:0x1000 |
|
20-21 |
AudioFormat |
2 |
小端 |
音频格式,一般为1表示PCM |
大端序:0x0001 小端序:0x0100 |
|
22-23 |
NumChannels |
2 |
小端 |
声道数 1单声道 2立体声 |
大端序:0x0002 小端序:0x0200 |
|
24-27 |
SampleRate |
4 |
小端 |
采样率 |
数据44100 大端序:0x0000AC44 小端序:0x44AC0000 |
|
28-31 |
ByteRate |
4 |
小端 |
字节率其实就是比特率/8 |
数据1411200/8=17600 大端序:0x000044C0 小端序:0xC0440000 |
|
32-33 |
BlockAlign |
2 |
小端 |
每采样一次需要多少字节= 通道数*采样位数/8 |
数据:2*16/8=4 大端序:0x0004 小端序:0x0400 |
|
34-35 |
BitPerSample |
2 |
小端 |
采样位数 8/16/24/32bit |
数据:16 大端序:0x0010 小端序:0x1000 |
|
Data块 |
36-39 |
DataId |
4 |
大端 |
固定内容'data' |
0x64617461 |
40-43 |
DataSize |
4 |
小端 |
PCM实际大小 |
数据:176000 大端序:0x0002AF80 小端序:0x80AF0200 |
|
44-(44+ DataSize) |
Data |
DataSize |
小端 |
PCM数据(其实这里的小端也是我们在录制时经常指定的录制字节序) |
PCM数据直接往上拼接 |
需要注意的是,官方资料是显示这些头文件数据是有大小端序之分的,但实际应用中我们全按大端序来也并不影响我们播放。反正别需要小端的数据你一会小端一会大端的,那肯定不行。至于怎么封装PCM转WAV的方法大家其实看上面的表就已经清楚了。
2.2、总结
优点:在数据上来说他是无损的,保留了原始数据/格式转换简单,几十行代码就能完成一个格式转换/无需转码解码。
缺点:体积过大/文件大小受限,存储文件大小数据的空间只有4字节最多也就2^32个byte将近4GB。
应用场景:其实除了音频外还可以用作广播/其它电信号转数字信号的文件存储。文章来源:https://www.toymoban.com/news/detail-423172.html
三、写在最后
这篇记录的是最简单的PCM和WAV音频格式,后续还有MP3和AAC格式的相关记录,有兴趣的可以点个关注等待后续更新,也希望大家能看看我其它博客给出建议哦。欢迎大家交流讨论,批评指正。文章来源地址https://www.toymoban.com/news/detail-423172.html
到了这里,关于音频格式(一)PCM和WAV的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!