Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java读取wav文件时出现问题_Java_Audio_Wav - Fatal编程技术网

用Java读取wav文件时出现问题

用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>();

我使用该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>();

 ....
     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;
        }

     }