Java サウンド ( javax.sound パッケージ ) について、あまり単純ではない質問があります。
クロスフェードとスムーズなボリュームとシーク コントロールを備えた MP3 プレーヤーを実装しています。
サウンドを 4096 バイトのチャンクでストリームとして読み取り、位置をミリ秒単位で手動で計算しています。
seek() (ストリームが赤くなる場所からベース位置を変更) したいとき、音波で本当に醜い「ジャンプ」が聞こえます。JLayer やその他の MP3 API を調べてみましたが、seek() 関数がまったくないか、この「醜いサウンド ジャンプ」もあります。
私の質問は次のとおりです。1 つの音波チャンクから別の音波チャンクへのこのジャンプをよりスムーズにするにはどうすればよいですか? 補間を試みましたが、「ジャンプが聞こえない」までの妥当な時間は 300 ミリ秒であり、seek() 関数には長すぎます。
この問題に遭遇しましたか?
解決策を知っていますか?
念のため、ここにコード サンプルを貼り付けます。
public void seek( long pPosition )
{
sourceDataLine.flush();
seekIndex = ( sourceDataLine.getMicrosecondPosition() / 1000 ) - currentPositionInMilliseconds;
}
public long getPositionInMilliseconds()
{ return ( sourceDataLine.getMicrosecondPosition() / 1000 ) - seekIndex; }
javax.sound の DataLine API のため、「ミリ秒単位の位置」が必要です。
ありがとう イライラする…