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のコードを見ると、バイト配列は次のとおりです。一連のサンプル。それぞれは次のとおりです。一連のチャネル。それぞれは次のとおりです。1つのチャネル上の1つのサンプルを表す一連のバイトで、最下位バイトが最初になります。の値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 に答える