在java中绘制wav文件

时间:2014-12-17 02:06:59

标签: java audio

我一直在寻找这个,但似乎没有人回答我的问题。 我一直试图通过这个绘制/绘制一个wav文件:

int result = 0;
try {
    result = audioInputStream.read(bytes);
} catch (Exception e) {
    e.printStackTrace();
}

然后使用结果作为图表的变量。我一直在想是否首先将结果更改为分贝是正确的。另外,我是否正确使用结果作为变量在图表中使用?或者有什么方法可以用来绘制wav文件吗?

1 个答案:

答案 0 :(得分:4)

您需要做的第一件事是读取文件的样本,这将为您提供波形的最小/最大范围(声波)......

    File file = new File("...");
    AudioInputStream ais = null;
    try {
        ais = AudioSystem.getAudioInputStream(file);
        int frameLength = (int) ais.getFrameLength();
        int frameSize = (int) ais.getFormat().getFrameSize();
        byte[] eightBitByteArray = new byte[frameLength * frameSize];

        int result = ais.read(eightBitByteArray);

        int channels = ais.getFormat().getChannels();
        int[][] samples = new int[channels][frameLength];

        int sampleIndex = 0;
        for (int t = 0; t < eightBitByteArray.length;) {
            for (int channel = 0; channel < channels; channel++) {
                int low = (int) eightBitByteArray[t];
                t++;
                int high = (int) eightBitByteArray[t];
                t++;
                int sample = getSixteenBitSample(high, low);
                samples[channel][sampleIndex] = sample;
            }
            sampleIndex++;
        }

    } catch (Exception exp) {

        exp.printStackTrace();

    } finally {

        try {
            ais.close();
        } catch (Exception e) {
        }

    }

//...

protected int getSixteenBitSample(int high, int low) {
    return (high << 8) + (low & 0x00ff);
} 

然后你需要确定最小/最大值,下一个例子只是检查通道0,但是你可以使用相同的概念来检查所有可用的通道......

    int min = 0;
    int max = 0;
    for (int sample : samples[0]) {

        max = Math.max(max, sample);
        min = Math.min(min, sample);

    }

仅供参考:阅读文件

时填充此信息会更有效

一旦你有了这个,你就可以对样本进行建模......但这取决于你打算使用的框架......