wav文件格式编码分析
WAV作为音频文件,其格式规则由微软和IBM共同制定。常用作无压缩的文件格式。
作为音频文件,文件特征包括:声道数,量化位数\((8bit, 16bit, 24bit)\),取样频率\((16khz, 22khz……)\)
wav格式文件所占容量\((B) = (取样频率 * 量化位数 * 声道数) * 时间 / 8\),除以8 的原因是因为 1字节 = 8bit
为了方便查看具体的编码的细节,我们首先先介绍下Ubuntu下一款16进制的文本查看器hexdump,其相应参数说明如下:
- hexdump -C <== 规范的十六进制和ASCII码显示(Canonical hex+ASCII display )
- hexdump -b <== 单字节八进制显示(One-byte octal display)
- hexdump -c <== 单字节字符显示(One-byte character display)
- hexdump -d <== 双字节十进制显示(Two-byte decimal display)
- hexdump -o <== 双字节八进制显示(Two-byte octal display)
- hexdump -x <== 双字节十六进制显示(Two-byte hexadecimal display)
比较来比较去,还是hexdump -C的显示效果更好些。
具体的编码方式定义如下:
起始地址 | 大小(byte) | 数据块类型 | 内容 |
---|---|---|---|
00H | 4 | 字符 | 资源交换文件标志(RIFF) |
04H | 4 | 长整数 | 从下个地址开始到文件尾的总字节数 |
08H | 4 | 字符 | WAV文件标志(WAVE) |
0CH | 4 | 字符 | 波形格式标志(fmt ),最后一位空格。 |
10H | 4 | 整数 | 过滤字节(一般为00000010H),若为00000012H则说明数据头携带附加信息(见“附加信息”)。 |
14H | 2 | 整数 | 为1时表示线性PCM编码,大于1时表示有压缩的编码。这里是0001H |
16H | 2 | 整数 | 通道数,1为单声道,2为双声道。这里是0001H。 |
18H | 4 | 长整数 | 采样频率,这里00001f40H = 8000 Hz |
1CH | 4 | 长整数 | byte率(每秒平均字节数) = 采样频率×通道数×位数/8 003e80H = 16000 = 8000116/8 |
20H | 2 | 整数 | DATA数据块长度(字节) |
22H | 2 | 整数 | PCM 位宽,0010H即16,一个量化样本占2byte。 |
随后2字节 | 2 | 整数 | 附加信息(可选,由上方过滤字节确定) |
随后4字节 | 4 | 字符 | 数据标示符(data) |
随后4字节 | 4 | 长整数 | DATA总数据长度字节 |
随后 | DATA数据块 00a640H = 42560 |