我正在尝试在perl中解码和播放WAV文件以进行进一步的操作,我找到了一些关于格式的参考资料,还有一些有趣的q + a
What does a audio frame contain? error in reading a wav file with C++ Writing musical notes to a wav file
我发现了“Cannonical WAVE文件格式”
但最后我正在测试2个不符合“标准”的WAV文件。 Mplayer在读取数据时完全没有问题,我想出了一个关于perl代码的解决方法:
sysread WAV, $riff, 12;
sysread WAV, $fmt, 24;
do{
sysread WAV, $wtf, 2;
}while( unpack("A4",$wtf) ne "da" );
sysread WAV, $wtf, 2;
#94
sysread WAV, $data, 4;
它仍然让我感到麻烦它是如何工作的,那个可变数据是在“每个样本的比特”字段和“数据”字段之间。
谢谢你们!
(我沉迷于这个论坛)
v--------- riff --------------v---------
0000000 4952 4646 685e 0931 4157 4556 6d66 2074
-------------- fmt --------------------
0000010 0028 0000 fffe 0006 bb80 0000 ca00 0008
---------v-----------------------------
0000020 000c 0010 0016 0010 060f 0000 0001 0000
---------------------------------------
0000030 0000 0010 0080 aa00 3800 719b 494c 5453
---------------------------------------
0000040 001a 0000 4e49 4f46 5349 5446 000e 0000
----------------------------------v----
0000050 614c 6676 3535 312e 2e39 3031 0034 6164
----v---------v
0000060 6174 6800 0931 0000 0000 0000 0000 0000
0000070 0000 0000 0000 0000 0000 0000 0000 0000
v--------- riff --------------v---------
0000000 4952 4646 7048 095b 4157 4556 6d66 2074
-------------- fmt --------------------
0000010 0012 0000 0001 0002 ac44 0000 b110 0002
---------v-----------------------------
0000020 0004 0010 0000 494c 5453 001a 0000 4e49
---------------------------------------
0000030 4f46 5349 5446 000e 0000 614c 6676 3535
-------------------v---------v---------v
0000040 312e 2e39 3031 0034 6164 6174 7000 095b
0000050 0000 0000 0000 0000 0000 0000 0000 0000
答案 0 :(得分:3)
test2.wav中的AudioFormat
字段为0xfffe
,表示标题为WAVEFORMATEXTENSIBLE
。当发生这种情况时,您需要以不同方式解释标题的其余部分。
AudioFormat : 2
NumChannels : 2
SampleRate : 4
ByteRate : 4
BlockAlign : 2
BitsPerSample : 2
cbSize : 2 - size of the rest of the chunk
ChannelMask : 4
SubFormat : 16 - GUID
有关详细信息,请查看WAVEFORMATEX
和WAVEFORMATEXTENSIBLE