本文为翻译理解文章,原文地址。
WAVE编码格式是微软的RIFF多媒体文件格式的一个子集。RIFF编码文件由一个文件头,和后续的一系列数据块字节组成。而WAVE编码是由RIFF文件头和仅一个称为“WAVE CHUNK”的数据块组成的格式,WAVE CHUNK又由两个子数据块组成,分别为描述编码格式的fmt子块,和记录采样数据的data子块。下面是一个标准的WAVE编码文件的字节组成:
注意,不同部分的字节字节序还有可能不同,有的是大端有的是小端。
字节解释:
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
注意:
WAVE编码文件的数据默认是小端字节序,如果是大端字节序,那么就是RIFX文件而不是RIFF。
采样数据块必须是偶数数量个字节。
8bits的采样数据以uint8数据类型存储,而16bits以int16存储。
WAVE编码的数据中可能有额外的data subchunk。
本文链接:https://www.zoucz.com/blog/2019/05/06/67a25c20-6fdd-11e9-90b5-eb40e9720ed0/