0

次のコードを使用して、ゲームでサウンドを再生します。

import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import java.io.IOException;

public class AudioController {

    public static void playback(String fileName) 
        throws LineUnavailableException, UnsupportedAudioFileException, IOException {
        AudioInputStream ais = AudioSystem.getAudioInputStream(AudioController.class.getClassLoader().getResourceAsStream("sounds/"+fileName));

        AudioFormat format = ais.getFormat();
        DataLine.Info info = new DataLine.Info(Clip.class, format);
        Clip clip = (Clip) AudioSystem.getLine(info);

        clip.open(ais);
        clip.start();
    }
}

問題は、サウンドを初めて再生する場合、何らかの初期化作業が行われるため、アプリケーションが短時間ハングすることです。その後に再生されるすべてのサウンドは、この動作を示していません。それを防ぐ方法は?

4

2 に答える 2

3

私もこの問題に遭遇しました。私の経験では、クリップのサイズとは関係ありませんが、クリップを最初に開始しようとすると、多くのクラスが読み込まれるという事実が原因です。ロードされている多くのJavaSoundクラスのオーバーヘッド。

引数-verbose:classをjavaに追加すると、この問題も発生する可能性があります。

私にとってうまくいくのは、音声のないsilent.wavファイルを用意することです。メインサウンドが始まる前に前もって再生すると、すべてが準備されます。

于 2011-05-05T20:24:08.260 に答える
2

まず、Javaのサウンドライブラリは、Java Media Frameworkのようなものに比べるとかなり弱いですが、これが最小限のサウンドエフェクトを備えた単純なゲームである場合は、Javaのサウンドライブラリで十分です。問題に適切に対処できるように、再生するサウンドファイルの種類(形式、長さなど)について詳しく説明することをお勧めします。

短いサウンドクリップ(1秒未満)を再生する場合は、最初にクリップを初期化し、必要なときにいつでも再生する必要があります。

//initialize this at the beginning of your program
AudioInputStream soundStream = AudioSystem.getAudioInputStream(new File("sound.wav"));

Clip soundEffect = AudioSystem.getClip();
soundEffect.open(soundStream);

...

//later, play the sound
soundEffect.start();

これに関する問題は、Clipのバッファーが非常に限られているため、リモートで何も再生できないことです(私の経験では、平均して1秒以上)。

バックグラウンドミュージックなどを再生したいが、バイトストリームを自分で管理したくない場合は、外部のライブラリを調べる必要があります。ダウンロードリンクが見つからないように見えるBigClipクラスがありますが、ご覧になることができます。

http://pscode.org/javadoc/org/pscode/xui/sound/bigclip/BigClip.html

より長いサウンドを再生する必要がある場合は、ここにあるPCMFilePlayerクラスの独自の変更バージョンを使用します(BigClipのように機能させるためにいくつかのメソッドを追加します)。

http://codeidol.com/java/swing/Au​​dio/Play-Non-Trivial-Audio/

どちらの場合も、プログラムの最初に妥当な量のサウンドをロードし、再生する必要がありますが、すべての場合において、これは非常に限られた数のサウンドで行われました。大量のサウンド/音楽を再生している場合、またはメモリ使用量が心配な場合は、はるかに強力なJMFなどのライブラリを調べることをお勧めします。

于 2011-03-13T20:03:49.280 に答える