用Java读取wav文件时出现问题
我使用该API在Java上读取wav文件: 我用Java读取了一个wav文件,并希望将所有值放入arraylist中。我写道:用Java读取wav文件时出现问题,java,audio,wav,Java,Audio,Wav,我使用该API在Java上读取wav文件: 我用Java读取了一个wav文件,并希望将所有值放入arraylist中。我写道: // Open the wav file specified as the first argument WavFile wavFile = WavFile.openWavFile(fileToRemoveSilence); List<Double> allBuffer = new ArrayList<Double>();
// Open the wav file specified as the first argument
WavFile wavFile = WavFile.openWavFile(fileToRemoveSilence);
List<Double> allBuffer = new ArrayList<Double>();
....
do {
// Read frames into buffer
framesRead = wavFile.readFrames(buffer, 50);
for (double aBuffer : buffer) {
allBuffer.add(aBuffer);
}
} while (framesRead != 0);
但是,在我使用的代码中:
wavFile.display();
它的输出:
....
... Frames: 74613
....
我的allbuffer大于API显示的帧。它是怎么来的
PS:我之前的问题:
PS2:
我修复了错误,但是当我运行程序时,有时会出现错误:可能是什么问题
java.lang.InterruptedException
at java.lang.Object.wait(Native Method)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
at sun.java2d.Disposer.run(Disposer.java:127)
at java.lang.Thread.run(Thread.java:662)
删除引用时出现异常:java.lang.InterruptedException从缓冲区复制到列表时,需要考虑帧读取。在最后一次调用中,您复制的双倍文件比实际读取的文件多。(即,与第一个链接中的示例代码完全相同)。我认为您需要这样的内容:
// Open the wav file specified as the first argument
WavFile wavFile = WavFile.openWavFile(fileToRemoveSilence);
List<double[]> allBuffer = new List<double[]>();
int bufferSize = 44100; // 1 second, probably
double[] buffer;
....
do {
// Read frames into buffer
buffer = new double[bufferSize];
framesRead = wavFile.readFrames(buffer, bufferSize);
if (framesRead == bufferSize)
{
allBuffer.add(buffer);
}
else
{
double[] crippleBuffer = new double[framesRead];
Array.Copy(buffer, crippleBuffer, framesRead);
allBuffer.add(crippleBuffer);
break;
}
}
//打开指定为第一个参数的wav文件
WavFile WavFile=WavFile.openWavFile(fileToRemoveSilence);
List allBuffer=新列表();
int bufferSize=44100;//可能是1秒
双[]缓冲区;
....
做{
//将帧读入缓冲区
缓冲区=新的双精度[bufferSize];
framesRead=wavFile.readFrames(缓冲区、缓冲区大小);
if(framesRead==缓冲区大小)
{
allBuffer.add(buffer);
}
其他的
{
double[]跛脚缓冲=新的double[framesRead];
复制(缓冲区、残废缓冲区、帧读取);
allBuffer.add(跛脚缓冲区);
打破
}
}
这将给您留下一个1秒的
列表双[]
样本数组(实际上,最后一个数组将略少于一秒钟)。然后,您可以迭代这个数组集合,并将每个数组转换为一个单独的WAV文件。您说得对。我更改了wavFile.readFrames(缓冲区,50);进入wavFile.readFrames(缓冲区,1);(和double[]buffer=新的double[1];)。但是仍然存在问题allBuffer的新大小是74614而不是74613,arrayList的最后两个元素是相同的?@kamaci,请再次阅读我的答案。您不需要更改缓冲区大小,只需在从缓冲区复制到allBuffer时使用framesRead结果值。查看第一个链接中的ReadExample.java代码,注意从buffer.Erp读取时framesRead是如何使用的,我忘了这是java,不是C#。也许这会有一些帮助:很好的文档和标记是一个很好的注释。还有一件事,那篇文章说原因与Thread.sleep()有关。但是,代码中没有sleep()方法。它是从任何内部的任何其他方法调用的吗?(即FileInputStream的read方法或任何其他方法?)它可能是WavFile API在内部执行的操作,除非您以多线程方式进行这些调用。
// Open the wav file specified as the first argument
WavFile wavFile = WavFile.openWavFile(fileToRemoveSilence);
List<double[]> allBuffer = new List<double[]>();
int bufferSize = 44100; // 1 second, probably
double[] buffer;
....
do {
// Read frames into buffer
buffer = new double[bufferSize];
framesRead = wavFile.readFrames(buffer, bufferSize);
if (framesRead == bufferSize)
{
allBuffer.add(buffer);
}
else
{
double[] crippleBuffer = new double[framesRead];
Array.Copy(buffer, crippleBuffer, framesRead);
allBuffer.add(crippleBuffer);
break;
}
}