Java用样本创建波形

时间:2012-11-08 13:31:05

标签: java arrays audio bytearray waveform

我已将声音文件加载到bytearray中。我很困惑我接下来要做的是获取信息来绘制波形的点。从我在网上找到的,我必须创建另一个数组?有人可以向我解释这是如何工作的,因为我不太了解如何收集样本。

1 个答案:

答案 0 :(得分:3)

根据文件格式收集样本。 让我们说,您的音频格式是一个8位单通道音频文件。

这是最简单的情况。您可以通过字节[]迭代并将存储的值绘制为幅度。

当您的文件是16位音频文件时,每个样本包含2个字节,因此您必须查看每个样本的两个字节。您可以通过调用以下方法来执行此操作:

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

它将为每个样本连接bytearray的第一个和第二个字节。 所以你的循环看起来像这样:

int sampleArray[] = new int[numSamples];

for(int i = 0, j=0;i < bytearray.length;)
{
    int iLow = bytearray[i];
    i++;
    int iHigh = bytearray[i];
    i++;

    sampleArray[j] = getSixteenBitSample(iHigh, iLow);
    j++;
}

第三种情况可能是,您的文件是16位立体声音频文件。在这种情况下,每个样本都有两个字节,在每个字节之后,通道会发生变化。

例如:

First read sample 1 from byte 0 and byte 1. -> First sample of channel 1
Second read sample 2 from byte 2 and byte 3 -> First sample of channel 2
Third read sample 3 from byte 4 and byte 5 -> Second sample of channel 1
Forth read sample 4 from byte 6 and byte 7 -> Second sample of channel 2

有关详细说明,请参阅this page