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