我正在使用Java WavFile类的迭代方法在Java中拆分立体声wav文件。当我使用python读取生成的mono wav文件并使用scipy.io.wavfile中的read方法将采样率和数据放出时,出现错误:
“值错误:文件意外结束。”
我尝试的其他mono wav文件没有出现此错误,只有我用Java制作的文件。在查看其他论坛帖子时,我知道它必须与我如何设置文件的标题信息有关,但是,在尝试更改并阅读API文档以确保我的用法正确后,我很茫然。 / p>
我的Java代码
try {
WavFile srcFile = WavFile.openWavFile(this.audioFile);
long numFrames = srcFile.getNumFrames();
long sampleRate = srcFile.getSampleRate();
int channels = 2;
int bitRate = 16;
File[] files = new File[channels];
WavFile[] wavFiles = new WavFile[channels];
for (int i = 1; i < channels + 1; i++) {
//Populates File Array
files[i - 1] = new File("output" + i + ".WAV");
wavFiles[i - 1] = WavFile.newWavFile(files[i - 1], 1, numFrames, bitRate, sampleRate);
}
int bufferLength = Math.toIntExact(numFrames);
int[][] buffer = new int[channels][bufferLength];
long frameCounter = 0;
while (frameCounter < numFrames){
srcFile.readFrames(buffer,bufferLength);
for (int j = 0; j<channels;j++){
wavFiles[j].writeFrames(buffer[j],bufferLength);
}
frameCounter += bufferLength;
}
} catch (Exception ex) {
System.out.println("WavFile failed to open source file: " + ex);
}
从wav文件中提取数据的简单python代码
import scipy.io.wavfile as wav
fs, data = wav.read(file)
wav.close()
据我了解,无论源代码是什么,读取wav文件时python代码都应该没有问题。
答案 0 :(得分:0)
似乎head of wav file中的数据不正确。我很确定文件中的帧数少于实际的帧数。
您可以尝试在Java代码中查找错误的根源,也可以使用对标头错误更具弹性的Python库,例如内置库wave
:
>>> import wave
>>> track = wave.open('output1.WAV', 'r')
>>> track.getnframes()
3417927
>>> track.readframes(10)
b'\x00\x00\x00\x00\xff\xff\x01\x00\x01\x00\xfe\xff\x01\x00\x00\x00\xff\xff\x01\x00'
也不要忘记做track.close()
或使用with statement来避免内存泄漏。
答案 1 :(得分:0)
您的Java代码从不为close()
调用wavFiles[j]
方法。根据{{3}},close()
方法“ 必须在使用writeFrames方法写入所有样本后被调用。如果未调用,则wav文件可能不完整。” < / p>