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

Java:在X-Y网格上绘制.flac音频文件的左声道和右声道。(示波器),java,audio,bytearray,oscilloscope,Java,Audio,Bytearray,Oscilloscope,我试图用Java创建一个X-Y示波器,但我被卡住了。我已经阅读了jFlac的所有文档,我用来解码.flac音频文件的库以及免费的无损音频编解码器文档。我似乎找不到我遇到的问题的答案。请考虑以下事项: public void processPCM(ByteData pcm) { byte[] temp = pcm.getData(); line.write(temp, 0, pcm.getLen()); leftAndRight = new int[pcm.getData(

我试图用Java创建一个X-Y示波器,但我被卡住了。我已经阅读了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);
    }
}
public void processPCM(字节数据pcm){
字节[]温度=pcm.getData();
行写入(temp,0,pcm.getLen());
leftAndRight=newint[pcm.getData().length];
对于(int i=0;igetLen()的值
是其中的有效字节数;由于重复使用相同的
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;
  }
}
byte[]data=pcm.getData();
int n_bytes=pcm.getLen();
int n_samples=n_字节/(n_通道*每个_样本的字节);
int k=0;
对于(int i=0;i查看其中的代码,字节数组的内容似乎是:一系列样本,每个样本是:一系列通道,每个通道是:一系列字节,代表一个通道上的一个样本,最低有效字节在前。
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;
  }
}
byte[]data=pcm.getData();
int n_bytes=pcm.getLen();
int n_samples=n_字节/(n_通道*每个_样本的字节);
int k=0;

对于(int i=0;我感谢你,这非常有用谢谢,这非常有用