目录
-
WAV格式文件概述
Waveform Audio Format(WAVE,又或者是因为.wav后缀而被大众所知的),它采用RIFF(Resource Interchange File Format)文件格式结构。通常用来保存PCM格式的原始音频数据,所以通常被称为无损音频。但是严格意义上来讲,wav也可以存储其它压缩格式的音频数据。
关于RIFF文件格式
- 构成RIFF文件的基本单位称之为块(chunk)。
- 每个RIFF文档是由若干个块构成。
- 每个块(chunk)由块标识、块长度及数据等三部分所组成。
WAV文件内部结构
(1)RIFF标头
0-3字节 | ChunkID | 包含ASCII格式的字母"RIFF",表明该文件为有效的 RIFF 格式文档 |
4-7字节 | ChunkSize | 从下一个字段首地址开始到文件末尾的总字节数。该字段的数值加 8 为当前文件的实际长度。 |
8-11字节 | format | 包含ASCII格式的字母"WAV",表明该文件是 WAV 格式文件 |
(2)fmt子块——描述声音数据的格式
12-15字节 | Subchunk1ID | 包含小写字符串"fmt " |
16-19字节 | Subchunk1Size | fmt块的大小(不包含Subchunk1ID和Subchunk1Size所占字节),其数值取决于编码格式,可以是 16、 18 、20、40 等。 |
20-21字节 | AudioFormat | 音频数据的编码方式,1表示PCM编码 |
22-23字节 | NumChannels | 声道数,单声道为1,双声道为2 |
24-27字节 | SampleRate | 采样率(每秒采样数),如44100 |
28-31字节 | ByteRate | 音频数据传送速率,单位是字节。该数值为:SampleRate× NumChannels×BitsPerSample/8。播放软件利用此值可以估计缓冲区的大小。 |
32-33字节 | BlockAlign | 采样帧大小(即每次采样的大小),单位是字节。该数值为:NumChannels × BitsPerSample/8。播放软件需要一次处理多个该值大小的字节数据,用该数值调整缓冲区。 |
34-35字节 | BitsPerSample | 存储每个采样值所用的二进制数位数,即记录每个声道的采样精度。常见的位数有 4、8、12、16、24、32。 |
(3)data子块——描述数据的大小和实际的声音数据
36-39字节 | Subchunk2ID | 包含字母“data” |
40-43字节 | Subchunk2Size | 音频数据块的大小(不包含Subchunk2ID和Subchunk2Size所占字节) |
44及以后字节 | Data | 实际的声音数据 |
注:data字段不一定是从36字节开始,data之前可能还会有拓展字段
-
WAV格式文件具体实例分析
以下列wav文件为例进行分析:
用二进制编辑器打开该文件:
1.RIFF标头部分
(1)第1-4字节:52 49 46 46 表示"RIFF”的ACSII字符,表明该文件为有效的 RIFF 格式文档
(2)第5-8字节:A6 88 E5 00 说明这个文件的数据大小,根据低位在前高位在后的原则,这串数据为0xE588A6,说明该文件大小为15042726+8=15042734字节。
打开文件属性可以验证:
(3) 第9-12字节:57 41 56 45 表示"WAV”的ACSII字符,表明该文件是 WAV 格式文件
2.fmt部分
(1)第13-16字节:66 6D 74 20 表示“fmt”的ASCII字符,是固定的
(2)第17-20字节:10 00 00 00 表示格式块长度,这串数据为0x00000010,表示块长度为16
(3)第21-22字节:01 00 这是一个WORD,表示编码格式为PCM
(4)第23-24字节:02 00 这是一个WORD,表示此文件为双声道文件
(5)第25-28字节:44 AC 00 00 表示采样频率,这串数据为0xAC44,表示采样频率为44100
(6)第29-32字节:10 B1 02 00 表示每秒数据量,这串数据为0x2B110,表示音频数据传送速率为176400,可以根据公式计算:SampleRate× NumChannels×BitsPerSample(根据后面可知为16)/8 = 44100×2×16/8=176400
(7)第33-34字节: 04 00 表示采样帧大小,这串数据为0x04,十进制数为4,也可以根据公式计算:NumChannels × BitsPerSample/8 = 2 × 16/8 = 4
(8)第35-36字节:10 00 表示每样本的数据位数,即16bit
3.data部分
(1)64 61 74 61:表示“data”的ASCII字符
(2)60 88 E5 00:表示音频数据块的大小,但是不包含Subchunk2ID和Subchunk2Size所占字节,这串数据为0xE58860,即音频数据块大小为15042656字节,与前面的整个文件数据数据大小15042726字节相差70字节,表明data前的头文件占70字节
-
问题
本实例中data部分前fmt部分后有34字节的拓展字段,在查找资料的过程中,一般都没有这些拓展部分,这些拓展部分也不知道具体表示什么意思,期待读者们在评论区里跟小编讨论讨论^-^