0

現在、jlgui (swt を使用して制御) を使用して単純な MP3 プレーヤーを構築する方法を学習しています。順調に進んでいますが、本当に頭を悩ませていることが 1 つあります。それは、コンピューターから出力されるサウンドのボリュームとパンをコントロールすることです。

BasicPlayer オブジェクトと BasicController を作成するクラスがあります。BasicController.setGain メソッドを使用しようとしましたが、それに値を入力すると、音量がミュートに設定され、曲の再生中にこの値を変更できないようです。気が狂ってしまうので、誰かがこれについて助けてくれたら本当に感謝しています:-(

また、次の提案を試すことを検討してください

AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("C:\\Kasabian.mp3"));
Clip clip = AudioSystem.getClip();
clip.open(audioInputStream);
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);

しかし、それをjlguiと組み合わせる方法がよくわかりません。

4

1 に答える 1

0

「ロール・ユア・オウン」ソリューション:

Java Sound チュートリアルには、「コントロールを使用したオーディオの処理」のページの最後にある「オーディオ データの直接操作」という非常にわずかなセクションがあります。 http://docs.oracle.com/javase/tutorial/sound/controls.html

私は「コントロール」をあきらめて、自分でやります。誰かがボリュームとパンに Java コントロールを利用する実用的なソリューションを持っている場合は、それについて聞いてうれしいです.

自分で音量を制御するには、AudioInputLine から読み取ったデータの「バッファ」に入り、データを PCM フレームに変換し、PCM 値に 1 の分数を掛ける必要があります (1.0 は最大音量、0 は最大音量です)。沈黙)、バイトに変換し、最後に SourceDataLine に書き込みます。

また、(まだ落胆していない場合)、ボリューム変数が疎結合で揮発性である場合に役立ちます。また、指定したボリュームが「ターゲット」であり、バッファー ループ内の変数が段階的にターゲットに近づく場合はさらに役立ちます。フレームごと。これは、クリック音を発生させる可能性のあるボリュームのジャンプを避けるためです。

そして (それでは不十分な場合)、0 から 1.0 の範囲を、可聴レベルによりよく一致する方程式 (指数関数や対数関数など) にマッピングすると便利です。

于 2013-02-03T22:28:10.427 に答える