Решение 'ValueError: Неожиданный конец файла.' из scipy / wavfile / read - PullRequest
1 голос
/ 28 марта 2019

Я разделяю стереофонический файл WAV на Java, используя итерационные методы с классом Java WavFile.Когда я использую python для чтения полученного монофонического файла wav и вывода частоты дискретизации и данных с использованием метода read из 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);
        }

Простой код Python, который извлекает данные из файла WAV

import scipy.io.wavfile as wav

fs, data = wav.read(file)

wav.close()

Насколько я понимаю, код Python не должен иметь проблем при чтении файла WAVфайл независимо от его источника.

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Ваш Java-код никогда не вызывает метод close() для wavFiles[j]. Согласно http://www.labbookpages.co.uk/audio/javaWavFiles.html, метод close() " должен быть вызван после того, как все сэмплы были записаны с использованием методов writeFrames. Если он не вызван, файл wav может быть неполным."

0 голосов
/ 28 марта 2019

Похоже, что вы получили неверные данные в заголовке 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() или использовать с оператором , чтобы избежать утечек памяти.

...