sox 生成的 wav header 不正确
Incorrect wav header generated by sox
我使用 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 的 header:
[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”和子块“数据”之前)。
第三行显示“ExtraParamSize”为0x0018 = 22字节。但实际上是 36 个字节(从第三行的“1600”到第五行的“0100”)。前16个字节是标准的。
那么额外的 36 个字节是多少?
好的,我找到答案了。
看第二行,可以发现音频格式为"feff",实际值为0xFFFE,所以这不是PCM标准波形格式,而是一种可扩展格式。
wav头详细介绍可以参考this link。这篇文章写得很好,感谢作者。
所以因为这是一个Non-PCM格式的wav,"fmt " chunk space 占用40个字节是没有问题的,后面跟着一个"fact" chunk,然后就是"data"块,所以一切都有意义。
我使用 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 的 header:
[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”和子块“数据”之前)。
第三行显示“ExtraParamSize”为0x0018 = 22字节。但实际上是 36 个字节(从第三行的“1600”到第五行的“0100”)。前16个字节是标准的。
那么额外的 36 个字节是多少?
好的,我找到答案了。
看第二行,可以发现音频格式为"feff",实际值为0xFFFE,所以这不是PCM标准波形格式,而是一种可扩展格式。
wav头详细介绍可以参考this link。这篇文章写得很好,感谢作者。
所以因为这是一个Non-PCM格式的wav,"fmt " chunk space 占用40个字节是没有问题的,后面跟着一个"fact" chunk,然后就是"data"块,所以一切都有意义。