使用Java读取wav文件的问题

时间:2011-05-12 19:33:07

标签: java audio wav

我使用该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:我以前的问题:

Reading wav file in Java

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

2 个答案:

答案 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。在最后一次调用中,您复制的内容比实际从文件中读取的数量多一倍。 (即与第一个链接中的示例代码完全相同)。