sox生成的wav标头不正确

时间:2018-06-26 02:42:14

标签: wav sox wave riff

我正在使用sox将2个通道,48000Hz,24位WAV文件(new.wav)转换为单声道WAV文件(post.wav)。 以下是相关的命令和输出:

[Farmer@Ubuntu recording]$ soxi new.wav 
Input File     : 'new.wav'
Channels       : 2
Sample Rate    : 48000
Precision      : 24-bit
Duration       : 00:00:01.52 = 72901 samples ~ 113.908 CDDA sectors
File Size      : 447k
Bit Rate       : 2.35M
Sample Encoding: 24-bit Signed Integer PCM

[Farmer@Ubuntu recording]$ sox new.wav -c 1 post.wav 
[Farmer@Ubuntu recording]$ soxi post.wav 

Input File     : 'post.wav'
Channels       : 1
Sample Rate    : 48000
Precision      : 24-bit
Duration       : 00:00:01.52 = 72901 samples ~ 113.908 CDDA sectors
File Size      : 219k
Bit Rate       : 1.15M
Sample Encoding: 24-bit Signed Integer PCM

看起来不错。但是让我们检查post.wav的标题。

[Farmer@Ubuntu recording]$ xxd post.wav | head -10
00000000: 5249 4646 9856 0300 5741 5645 666d 7420  RIFF.V..WAVEfmt 
00000010: 2800 0000 feff 0100 80bb 0000 8032 0200  (............2..
00000020: 0300 1800 1600 1800 0400 0000 0100 0000  ................
00000030: 0000 1000 8000 00aa 0038 9b71 6661 6374  .........8.qfact
00000040: 0400 0000 c51c 0100 6461 7461 4f56 0300  ........dataOV..

这是standard wav file header structure

第一行没问题。

第二行“ 2800 0000”显示子块“ fmt”的大小,它应为0x00000028(因为这是小尾数)= 40字节。但是有54个字节(在子块“ fmt”和子块“ data”之前)。

第三行显示“ ExtraParamSize”为0x0018 = 22字节。但是实际上是36个字节(从第三行的“ 1600”到第五行的“ 0100”)。前16个字节是标准字节。

那额外的36个字节是什么?

1 个答案:

答案 0 :(得分:1)

好的,我找到答案了。
看第二行,我们发现音频格式为“ feff”,实际值为0xFFFE,因此这不是PCM标准波形格式,而是可扩展格式。

Wav头的详细介绍可以参考this link。这篇文章写得很好,感谢作者。

因为这是非PCM格式的波形,所以“ fmt”块空间占用40个字节是没有问题的,然后是“事实”块,然后是“数据”块,所以一切都说得通。