Java:在X-Y网格上绘制.flac音频文件的左右声道。 (示波器)

时间:2011-03-20 21:47:36

标签: java audio bytearray oscilloscope

我正在尝试用Java创建一个X-Y示波器,但我已经卡住了。我已经阅读了jFlac的所有文档,我用来解码我的.flac音频文件的库和免费的无损音频编解码器文档here。我似乎找不到我遇到的问题的答案。请考虑以下事项。

public void processPCM(ByteData pcm) {
    byte[] temp = pcm.getData();
    line.write(temp, 0, pcm.getLen());
    leftAndRight = new int[pcm.getData().length];
    for(int i = 0; i < temp.length; i+=2){
        leftAndRight[i/2] = (temp[i + 1]<<8) + (temp[i] & 0xff);
    }
}

这是我文件中的样本数据放入SourceDataLine并播放的地方。在我将数据写入线后,我希望将左右音频分别转换为单独的整数数组变量x []和y []。

这是我正在使用的文件的StreamInfo:

  

PCM_SIGNED 44100.0 Hz,16位,立体声,4字节/帧,小端

从上面的代码中,pcm.getLen()返回值16384,pcm.getData()返回一个长度为90112的字节数组。这是这个字节数组中的数据,如果我没记错的话,我需要分离左右声道,然后转换为整数数组。这是我不明白如何完成的部分。

编辑:我将上面的代码更改为我遇到的东西,我认为可能是如何将字节数组转换为整数数组,但我仍然对左右声道的排列方式一无所知。

1 个答案:

答案 0 :(得分:1)

查看http://jflac.cvs.sourceforge.net/viewvc/jflac/jFLAC/src/java/org/kc7bfi/jflac/FLACDecoder.java?revision=1.13&view=markup中的代码,看起来字节数组的内容是:一系列样本,每个样本都是:一系列通道,每个通道都是:一系列代表一个字节的字节在一个通道上采样,最低有效字节优先。 getLen()的值是其中的有效字节数;可能会有更多数据,因为重复使用相同的ByteData对象,可能会对其进行过度分配以避免重复重新分配等。

所以,你会想要这样的东西:

byte[] data = pcm.getData();
int n_bytes = pcm.getLen();
int n_samples = n_bytes / (n_channels*bytes_per_sample);
int k=0;
for (int i=0; i<n_samples; ++i) {
  for (int j=0; j<n_channels; ++j) {
    output[j][i] = data[k] + (data[k+1)<<8);
    k += 2;
  }
}

(警告:代码尚未经过测试,可能完全由语法错误和错误组成,但希望这个想法足够明确)。