1

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

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 的字节数组。如果我没记错的话,我需要将这个字节数组中的数据分开左右声道,然后转换成整数数组。这是我不明白如何完成的部分。

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

4

1 回答 1

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

(警告:代码尚未经过测试,可能完全包含语法错误和错误,但希望这个想法足够清晰)。

于 2011-03-20T22:16:06.667 回答