首页 > 解决方案 > 解决“ValueError:文件意外结束。” 从 scipy/wavfile/读取

问题描述

我正在使用 Java WavFile 类的迭代方法在 Java 中拆分立体声 wav 文件。当我使用 python 读取生成的单声道 wav 文件并使用 scipy.io.wavfile 中的读取方法输出采样率和数据时,出现错误:

“值错误:文件意外结束。”

我尝试的其他单声道 wav 文件没有出现此错误,只有我使用 Java 制作的文件。查看其他论坛帖子,我知道这必须与我如何设置文件的标题信息有关,但是,在尝试争吵并阅读 API 文档以确保我的用法正确之后,我不知所措。

我的 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()

据我了解,无论其来源如何,python 代码读取 wav 文件都应该没有问题。

标签: javapythonscipywav

解决方案


看来您在wav 文件的头部得到了不正确的数据。我很确定文件中的帧数小于实际帧数。

您可以尝试在 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 语句来避免内存泄漏。


推荐阅读