我正在尝试在R中打开声音文件,但load.wave()
函数会抱怨该文件“不完整”。声音在许多其他音频软件(mplayer,Audacity,Praat等)上播放得很好,而file
并没有报告它与其他没有问题的WAV文件有任何不同:
RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 22050 Hz
我知道load.wave()
在内部调用C函数来处理数据,但我不知道该函数是什么,或者它做了什么(所以我不明白它为什么抱怨)。来自load.wave()
的来电在R中定义为.Call("load_wave_file", where, PACKAGE = "audio")
,其中where
是该文件的路径。
在Audacity中打开声音并再次保存为WAV文件会生成相同的声音文件,可以在R中打开而不会出现任何问题。
然而,文件似乎有很大不同。使用vbindiff
,标题中存在差异:
# Original file
0000 0000: 52 49 46 46 39 AE 02 00 57 41 56 45 66 6D 74 20 RIFF9... WAVEfmt
0000 0010: 12 00 00 00 01 00 01 00 22 56 00 00 44 AC 00 00 ........ "V..D...
0000 0020: 02 00 10 00 00 00 64 61 74 61 D4 AD 02 00 F9 FF ......da ta......
# Fixed file
0000 0000: 52 49 46 46 F8 AD 02 00 57 41 56 45 66 6D 74 20 RIFF.... WAVEfmt
0000 0010: 10 00 00 00 01 00 01 00 22 56 00 00 44 AC 00 00 ........ "V..D...
0000 0020: 02 00 10 00 64 61 74 61 D4 AD 02 00 FA FF F6 FF ....data ........
以及整个文件:
更有趣的是,原始文件末尾的一个块已被删除:
# Original file
0002 ADF0: 5E 00 5D 00 5F 00 5F 00 5F 00 5F 00 5E 00 5D 00 ^.]._._. _._.^.].
0002 AE00: 5B 00 63 75 65 20 1C 00 00 00 01 00 00 00 01 00 [.cue .. ........
0002 AE10: 00 00 88 58 01 00 64 61 74 61 00 00 00 00 00 00 ...X..da ta......
0002 AE20: 00 00 88 58 01 00 4C 49 53 54 13 00 00 00 61 64 ...X..LI ST....ad
0002 AE30: 74 6C 6C 61 62 6C 07 00 00 00 01 00 00 00 52 54 tllabl.. ......RT
0002 AE40: 00
# Fixed file
0002 ADF0: 5E 00 5F 00 5F 00 5F 00 5F 00 5D 00 5F 00 59 00 ^._._._. _.]._.Y.
0002 AE00:
0002 AE10:
0002 AE20:
0002 AE30:
0002 AE40:
1。这个文件有什么问题阻止我打开它?
2。原始文件末尾的数据是什么?(见下文)
我知道有多个音频处理程序,它们对WAV规范相当自由,所以这种类型的问题并不少见。我只是想知道发生了什么,可能实现一个修复(这不需要我启动Audacity)并防止它在将来再次发生。
这个块似乎是一个“Cue-Points Chunk”,正如here解释的那样:
提示点块识别波形数据流中的一系列位置。
我想这意味着它应该是无害的,但这是导致问题的原因吗?