java - 解决“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 文件都应该没有问题。
解决方案
看来您在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 语句来避免内存泄漏。
推荐阅读
- protractor - 如何从 aria-rowcount 中获取价值,在页面上不可见,量角器
- .net - 如何将多层 PDF 转换为 PNG 选择将在 .NET 中导出的图层
- javascript - Angular/Typescript - 如何读取 JSON 作为对象
- sql - 是否可以对一个语句做同样的事情?
- google-apps-script - 运行由其他用户创建的脚本的权限
- javascript - document.cookie 没有在 chrome 上写一些键
- android - 有什么办法可以找到确切的 TransactionToolargExcetion 行,
- c# - UWP 应用程序(C#)中的“无法连接到任何指定的 MySQL 主机”
- python - Pandas:分级分组,带箱
- html - 无法在不以角度刷新整个页面的情况下更新导航栏组件