我使用该API在Java上读取wav文件:Reading and Writing Wav Files in Java
我用Java读取了一个wav文件,并希望将所有值都放入arraylist中。我写道:
// 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);
当我在调试器中检查allBuffer的大小时,它说:
74700
然而,在我使用的代码中:
wavFile.display();
它的输出:
....
... Frames: 74613
....
我的allbuffer比那个API显示的帧大。它是怎么来的?
PS:我以前的问题:
How to divide a wav file into 1 second pieces with Java?
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
答案 0 :(得分:2)
我想你想要这样的东西:
// 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;
}
}
这将为您留下List
1秒double[]
个样本数组(实际上,最后一个数组将少于一整秒)。然后,您可以遍历此数组集合,并将每个数组转换为单独的WAV文件。
答案 1 :(得分:1)
从缓冲区复制到列表中时,您需要考虑framesRead。在最后一次调用中,您复制的内容比实际从文件中读取的数量多一倍。 (即与第一个链接中的示例代码完全相同)。