解决“ ValueError:文件意外结束”。从scipy / wavfile / read

时间:2019-03-27 23:23:04

标签: java python scipy wav

我正在使用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代码都应该没有问题。

2 个答案:

答案 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>