5

オーディオ データを処理するアプリケーションに取り組んでいます。私は Java を使用しています (MP3SPI、Jlayer、および Tritonus を追加しました)。オーディオ データを .wav ファイルからバイト配列に抽出しています。私が扱っているオーディオ データ サンプルは 16 ビット ステレオです。

私が読んだことによると、1つのサンプルの形式は次のとおりです。

あああああああああああああああああああああああああああああああああああああああ

ここで、AABB は左チャネルと CCDD 右チャネルを表します (チャネルごとに 2 バイト)。このサンプルを double 値型に変換する必要があります。データ形式について読んだことがあります。Java はビッグ エンディアンを使用し、.wav ファイルはリトル エンディアンを使用します。私は少し混乱しています。変換プロセスを手伝ってもらえますか? ありがとうございます

4

4 に答える 4

5

警告: 整数とバイトは符号付きです。それらをまとめてパックするときに、下位バイトをマスクする必要があるかもしれません。

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 ...

}
于 2009-06-05T20:28:10.197 に答える
4

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

[注文]

public final ByteBuffer order(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 はなんて素晴らしい言語でしょう ;-)

于 2009-10-26T22:02:45.373 に答える
0

エンディアンのスワッピングを行うライブラリを個人的に探します。各オーディオ ファイル形式には、エンディアンに関する仮定があり、これを適切に行うことは、Wave ファイルがサポートするすべてのビット深度/データ型に対して注意が必要です。

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

最も一般的なタイプの wave ファイルをサポートしたい場合は、これらすべてのデータタイプのエンディアン変換が必要になります。

上記のほとんどのタイプのバイトスワッピングを提供する ByteSwapper を調べます

残念なことに、Java のファイル IO クラスにはエンディアン フィールドがありません。edianness が大きいまたは小さいファイルを単純に開くことができるようにすることは、この問題のはるかに簡単な解決策です。

于 2009-06-06T04:08:11.937 に答える
0

リトル エンディアンは、データが BBAA および DDCC の形式であることを意味します。あなたはそれを交換するだけです。

フレームの最初から:

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

ここで、i はサンプルのインデックスです。

于 2009-06-05T20:04:07.297 に答える