以前、データを BigEndian に変換する/変換しないという新しい問題が発生byte[]しました。
何が起こっているかは次のとおりです。short[]byte[]
TargetDataLineデータをに読み込むために使用していbyte[10000]ます。AudioFormatオブジェクトは任意にtrueBigEndianに設定されています。byte[]に変換する必要があります。short[]AudioFormatBigEndian を true に設定するか false に設定する必要があるかわかりません。
両方のケースを試しましたが、両方のケースで例外が発生しました。
に変換するbyte[]にshort[]は、次のようにします。
fromMic.read(tempBufferByte, 0, tempBufferByte.length);
for(int i=0;i<tempBufferShort.length;i++){
tempBufferShort[i] = (short) tempBufferByte[i];
}
ここで:
fromMicis TargetDataLine
tempBufferbyteis is byte[10000]
tempBufferShortisshort[10000]
私は例外を取得します:
java.lang.RuntimeException: failed to write packet: com.xuggle.xuggler.IPacket@90098448[complete:true;dts:12;pts:12;size:72;key:true;flags:1;stream index:1;duration:1;position:-1;time base:9/125;]
必要なその他の情報:
writer.addAudioStream(0,1,fmt.getChannels(),(int)fmt.getSampleRate());
writer.encodeAudio(1,tempBufferShort,timeStamp,TimeUnit.NANOSECONDS);
AudioFormat に関する Java ドキュメント
...エンコーディングに加えて、オーディオ形式には、データの正確な配置をさらに指定する他のプロパティが含まれます。これらには、チャネル数、サンプル レート、サンプル サイズ、バイト オーダー、フレーム レート、およびフレーム サイズが含まれます...
と
16 ビット サンプル (または 1 バイトより大きいその他のサンプル サイズ) の場合、バイト順が重要です。各サンプルのバイトは、「リトル エンディアン」または「ビッグ エンディアン」スタイルで配置されます。
質問:
BigEndianas trueを維持する必要がありますか?javax.sound.sampled.AudioFormatAudioFormat オブジェクトによって事前にフォーマットされた BigEndian データを取得していると思います。