以前、データを BigEndian に変換する/変換しないという新しい問題が発生byte[]
しました。
何が起こっているかは次のとおりです。short[]
byte[]
TargetDataLine
データをに読み込むために使用していbyte[10000]
ます。AudioFormat
オブジェクトは任意にtrueBigEndian
に設定されています。byte[]
に変換する必要があります。short[]
AudioFormat
BigEndian を true に設定するか false に設定する必要があるかわかりません。
両方のケースを試しましたが、両方のケースで例外が発生しました。
に変換するbyte[]
にshort[]
は、次のようにします。
fromMic.read(tempBufferByte, 0, tempBufferByte.length);
for(int i=0;i<tempBufferShort.length;i++){
tempBufferShort[i] = (short) tempBufferByte[i];
}
ここで:
fromMic
is TargetDataLine
tempBufferbyte
is is byte[10000]
tempBufferShort
isshort[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 バイトより大きいその他のサンプル サイズ) の場合、バイト順が重要です。各サンプルのバイトは、「リトル エンディアン」または「ビッグ エンディアン」スタイルで配置されます。
質問:
BigEndian
as trueを維持する必要がありますか?javax.sound.sampled.AudioFormat
AudioFormat オブジェクトによって事前にフォーマットされた BigEndian データを取得していると思います。