2

javax.sound.sampled.ClipsJava アプレットの配列にロードされた 2 つのオーディオ クリップ間をスムーズに移行したいと考えています。現時点では、1 つのクリップを停止して次のクリップを開始しますが、オーディオが突然停止および開始するため、クリック音が発生します。クリップ インターフェイスを使用して、同じトラック位置を維持しながらクリップ間のループとトランジションを実行できるようにする必要があります。

1 つのクリップを停止する前にゲインを下げてから、次のクリップを開始するときにゲインを上げてみましたFloatControl.Type.MASTER_GAIN。ゲインをすばやく変更したい場合はバッファをフラッシュする必要がありますが、ゲインをあまりにも速く変更しようとすると、クリックしてカクカクしてしまいます。さらに、バッファをフラッシュするには、クリップを停止して再起動し、フラッシュされたバッファを元に戻す必要があります (したがって、フラッシュされた部分を飛び越えません)。これにより、取り除こうとしているのと同じクリックが発生します。

ゲインをすばやく (200ms 以内に) 0dB から -60dB に変更した経験がある人はいますか。バッファ レベルに到達して、ビットを直接操作する必要があるかもしれないと考えていますが、Clip インターフェイスからこれに到達する方法がわかりません。

助言がありますか?

4

1 に答える 1

1

複数のストリームを持つ単一の Clip オブジェクトを作成し、フェードインやフェードアウトなどのカスタム トランジションを使用してストリームを切り替えることができる、Clip クラスのすばらしい拡張機能を見つけました。これで煩わしいクリック音から解放されます!

HydrogenAudio フォーラムで見つけました。これは、ハンドル googlebot を使用する素晴らしい人によって書かれています。GNU ライセンスの下でオープン ソースです。

クラスが作成されたプログラムを説明するフォーラムの投稿へのリンクは次のとおりです。

Java クラス ファイルを取得できる Google コード ページへのリンクは次のとおりです

これらのクラスを使用することになった場合、SwitchableArrayClip.java クラスの open および addstream 関数でいくつかの配列境界エラーが見つかる可能性があります。

次のように変更する必要があります。

// Fill it
    int numRead = 0;
    int offset = 0;
    while (numRead != -1) {
        numRead = stream.read(audioData[0], offset - numRead, len - numRead);
    }

に:

// Fill it
    int numRead = 0;
    int offset = 0;
    while (numRead != -1) {
        numRead = stream.read(audioData[0], offset, len - offset);
        offset += numRead;
    }

プレーヤーがスレッド化されているため、setFramePosition の使用など、他にもいくつかの問題があります。しかし、私はあなたにそれらを理解させるか、ここで尋ねることができます.

これが誰かを助けることを願っています!

于 2010-09-02T18:30:04.867 に答える