2009-06-05 5 views
4

私はオーディオデータを処理するアプリケーションに取り組んでいます。 私はjavaを使用しています(私はMP3SPI、Jlayer、Tritonusを追加しました)。 .wavファイルからバイト配列にオーディオデータを抽出しています。私が扱っているオーディオデータサンプルは16ビットステレオです。私は1つのサンプルのフォーマットを読んだものによれば.WAVオーディオデータサンプルをダブルタイプに変換するには?

である:AABBは、左チャンネルとCCDD rigthチャネル(各チャネルに2バイト)を表す

AABBCCDD

。 このサンプルをdouble型に変換する必要があります。私はデータフォーマットについて読んでいます。 Javaはビッグエンディアンを使用し、.wavファイルはリトルエンディアンを使用します。私はちょっと混乱している。あなたは変換プロセスで私を助けてくれますか? ありがとうございました

答えて

3

警告:整数とバイトが署名されています。おそらく、一緒に梱包するときに下位バイトをマスクする必要があります。

for (int i =0; i < length; i += 4) { 
    double left = (double)((bytes [i] & 0xff) | (bytes[i + 1] << 8)); 
    double right = (double)((bytes [i + 2] & 0xff) | (bytes[i + 3] << 8)); 

    ... your code here ... 

} 
+0

良い点ですが、すべてのバイト[]アクセスでそれを実行する必要があります(左に24ビット以上シフトしない限り)。それらはintに昇格されるので、0x80は0xffffff80になります – erickson

+0

これはまさに私が望んでいたものです。上位バイトの符号を保持します。 実際には、私はそれをテストしませんでした(特に浮動小数点値ではうまくいきません)が、符号付き16ビット値は32ビット以上に昇格したときにその符号を失ってはいけません。 –

+0

こんにちは、あなたの答えに感謝します。 @erickson; ;私はあなたのコメントを本当に理解していません。 @GB;これを行うことで、左チャンネルの各サンプルの値を左に、右チャネルの右のサンプルの値を左に取得します。最後に、各サンプルに対して2つの値を設定します。各サンプルに対して1つの値を取得することは可能ですか? – dedalo

0

リトルエンディアンは、データがBBAAとDDCCの形式であることを意味します。あなたはちょうどそれを交換するだろう。フレームの先頭から

int left = (bytes[i+1] << 8) + bytes[i]; 
int right = (bytes[i+3] << 8) + bytes[i+2]; 

私はあなたのサンプルのあなたの指標です。

+1

- I優先順位がちょっと変わっているかもしれないことを覚えているようだ... –

+0

ええ、+ - シフトよりも高い優先順位が...編集されている。 – CookieOfFortune

+1

これは、下位ビットの適切なマスキングに欠けています。 – erickson

0

私は個人的にエンディアンを交換するライブラリを探します。各オーディオファイル形式は、あなたのためのエンディアンについての仮定を持っており、すべてのビット深度/データ型はファイルのサポートを振るために、この権利を得ることは難しいです:

  • 8ビット - uint8の
  • 16ビット -
  • INT16 24ビット -
  • INT32
  • 32ビット - floatとしてのint32
  • 32ビット - フロート
  • 64 - ダブル

ほとんどの一般的なタイプのウェーブファイルをサポートしたい場合は、これらのデータタイプすべてに対してエンディアン変換が必要です。

私はByteSwapperを見ていますが、上記のほとんどのタイプのバイトワーピングがあります。

あまりにも悪いJavaは、ファイルIOクラスにエンディアン・フィールドを持っていません。エディナネスが大きいか小さいファイルを単に開くことができれば、この問題はもっと簡単に解決できます。

4

ByteBuffer(java.nio.ByteBuffer)を使用する場合は、メソッドの順序を使用できます。

[オーダー]

パブリック最終ByteBufferの順序(BYTEORDERのBO)この後

Modifies this buffer's byte order. 

Parameters: 
    bo - The new byte order, either BIG_ENDIAN or LITTLE_ENDIAN 
Returns: 
    This buffer 

することができますして上述した値を取得します。

GETCHAR() getShort() のgetInt() はgetFloat() はGetDouble()

素晴らしい何の言語であるJavaの;-)私は個人的にシフト周りの括弧を置くところ

+1

+1私はこれが下に評価されたように感じる – Matt

関連する問題