本文为翻译理解文章,原文地址

WAVE编码格式是微软的RIFF多媒体文件格式的一个子集。RIFF编码文件由一个文件头,和后续的一系列数据块字节组成。而WAVE编码是由RIFF文件头和仅一个称为“WAVE CHUNK”的数据块组成的格式,WAVE CHUNK又由两个子数据块组成,分别为描述编码格式的fmt子块,和记录采样数据的data子块。下面是一个标准的WAVE编码文件的字节组成:

image.png

注意,不同部分的字节字节序还有可能不同,有的是大端有的是小端。

字节解释:
RIFF头部分

字节偏移 字段大小 字段名称 详细描述
0 4 ChunkID “RIFF”字符的ASCIIC字符编码,大端,0x52494646
4 4 ChunkSize 整个文件在此字段之后的大小,ChunkSize=36+SubChunk2Size
8 4 Format “WAVE”字符的ASCIIC字符编码,大端,0x57415645

fmt sub-chunk部分

字节偏移 字段大小 字段名称 详细描述
12 4 Subchunk1ID “fmt “字符的ASCIIC字符编码,大端,0x666d7420
16 4 Subchunk1Size “fmt”子块在此字段后的字节大小,如上图,PCM格式的话此值为16
20 2 AudioFormat 压缩格式,PCM的话是1,1之外的表示某种其它的压缩格式
22 2 NumChannels 声道数,单声道1,立体声2等
24 4 SampleRate 采样率,如8000/44100等,即每秒多少个采样点
28 4 ByteRate == SampleRate NumChannels BitsPerSample/8
32 2 BlockAlign == NumChannels * BitsPerSample/8 一个采样点所有声道数据总字节大小
34 2 BitsPerSample 比特率,一个采样点8bits、16bits等

data sub-chunk部分

字节偏移 字段大小 字段名称 详细描述
36 4 Subchunk2ID “data”字符的ASCIIC字符编码,大端,0x64617461
40 4 Subchunk2Size == 采样点个数 NumChannels BitsPerSample/8,data部分的长度
44 * Data 真正的音频采样数据

根据上面的编码结构,假如一个WAVE编码音频文件长度为4s,采样率16000,比特率16bits,单声道,那么可以估算其大小约:
4160002byte*1 = 125kb(header部分较小可忽略)

下面是一个72字节大小的wave格式编码文件的字节示例:

52 49 46 46 24 08 00 00 57 41 56 45 66 6d 74 20 10 00 00 00 01 00 02 00 
22 56 00 00 88 58 01 00 04 00 10 00 64 61 74 61 00 08 00 00 00 00 00 00 
24 17 1e f3 3c 13 3c 14 16 f9 18 f9 34 e7 23 a6 3c f2 24 f2 11 ce 1a 0d 

image.png

注意:

WAVE编码文件的数据默认是小端字节序,如果是大端字节序,那么就是RIFX文件而不是RIFF。

采样数据块必须是偶数数量个字节。

8bits的采样数据以uint8数据类型存储,而16bits以int16存储。

WAVE编码的数据中可能有额外的data subchunk。

☞ 参与评论