多媒体文件解析(一):WAV文件解析
在之前的《多媒体文件格式》系列中,我们对主流的多媒体的文件格式进行了整理和讲述。这里开始我们开始对如何分析和解释多媒体文件来进行整理,以便于以后我们自己排查一些问题的时候有一些帮助。本篇我们就讲一下WAV文件格式。
首先我们知道WAV格式的实质就是在 PCM 文件的前面加了一个文件头。下面是使用二进制打开的一个WAV文件,此文件只写入了WAV头信息。整个文件的大小为44b。
下面我们就针对WAV头进行一点点的解析和整理。WAV文件遵循RIFF规则,其内容以区块最小单位进行存储。WAV文件由3个区块组成:RIFF chunk, Format chunk 和 Data chunk。另外还有可能包含其他的可选区块,如:Fact chunk、Cue points chunk等。
一、RIFF区块
下面我们针对此区块的三个名称的内容进行分析:
ID:在WAV格式中,ID固定以 RIFF 为标识。换成进制数据为:0x52494646,此值为大端序,按照正常的顺序进行读取即可。
Size:Size的大小为整个文件的长度减去ID和Size的长度. 注意此为小端序,计算大小的时候,需从右边往左读。例如本WAV的Size为36(十六进制:24),再加上Size和ID的长度,整个文件的大小44b就是这么来的.
Type:在WAV文件中,Type的内容固定为 "WAVE",表示后面会有两个区块,Format区块和Data区块。
二、FORMAT区块
ID:此区块的ID以'fmt '为标识
Size:表示该区块数据的长度(不包含ID和Size的长度)
AudioFormat:表示Data区块存储的音频数据的格式,PCM音频数据的值为1
NumChannels:表示音频数据的声道数,1:单声道,2:双声道
SampleRate:表示音频数据的采样率
ByteRate:每秒数据字节数 = SampleRate * NumChannels * BitsPerSample / 8
BlockAlign:每个采样所需的字节数 = NumChannels * BitsPerSample / 8
BitsPerSample:每个采样存储的bit数,8:8bit,16:16bit,32:32bit
三、DATA区块
ID:区块的ID以'data'为标识
Size:表示音频数据的长度,N = ByteRate * seconds
Data:存储的是音频数据
四、WAV音频数据存储方式
WAV文件的PCM音频数据以小端形式来进行数据存储。
先简单的说明一下大端存储和小端存储的区别。
- 大端存储:数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
- 小端存储:数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中.
![](https://img2020.cnblogs.com/blog/682616/202008/682616-20200831175418454-1212695851.png)
这里解释一下WAV文件数据存储的最小单元是采样点,也就是说,如果WAV头中配置采样点的大小是16bit,那么两个字节代表一个采样点(Int16),如果为32bit则是4个字节代表一个采样点(Int32)。然而,它们都是无符号整型,只是采样的精度不同而已。另外,要为每个声道都存储采样点。如果是单声道的话,采样点就是简单的顺序排列。如果是双声道,采样点就是左右声道交错排列。采样频率也需要与数据的保持一致,否则可能会造成音频播放速度上出现异常。
具体的格式可以参照下图进行理解: