0

作成中のゲームにサウンドを追加しようとしていますが、サウンドをロードしようとするたびに Stream Closed Exception が発生します。なぜこれが起こっているのかわかりません。

サウンドをロードします:

public class WavPlayer extends Thread {

/*
 * @param s The path of the wav file.
 * @return The sound data loaded into the WavSound object
 */
public static WavSound loadSound(String s){
    // Get an input stream
    InputStream is = WavPlayer.class.getClassLoader().getResourceAsStream(s);
    AudioInputStream audioStream;
    try {
        // Buffer the input stream
        BufferedInputStream bis = new BufferedInputStream(is);
        // Create the audio input stream and audio format
        audioStream = AudioSystem.getAudioInputStream(bis); //!Stream Closed Exception occurs here
        AudioFormat format = audioStream.getFormat();
        // The length of the audio file
        int length = (int) (audioStream.getFrameLength() * format.getFrameSize());
        // The array to store the samples in
        byte[] samples = new byte[length];
        // Read the samples into array to reduce disk access
        // (fast-execution)
        DataInputStream dis = new DataInputStream(audioStream);
        dis.readFully(samples);
        // Create a sound container
        WavSound sound = new WavSound(samples, format, (int) audioStream.getFrameLength());
        // Don't start the sound on load
        sound.setState(SoundState.STATE_STOPPED);
        // Create a new player for each sound
        new WavPlayer(sound);
        return sound;
    } catch (Exception e) {
        // An error. Mustn't happen
    }
    return null;
}

// Private variables
private WavSound sound = null;

/**
 * Constructs a new player with a sound and with an optional looping
 * 
 * @param s The WavSound object
 */
public WavPlayer(WavSound s) {
    sound = s;
    start();
}

/**
 * Runs the player in a separate thread
 */
@Override
public void run(){
    // Get the byte samples from the container
    byte[] data = sound.getData();
    InputStream is = new ByteArrayInputStream(data);
    try {
        // Create a line for the required audio format
        SourceDataLine line = null;
        AudioFormat format = sound.getAudioFormat();
        // Calculate the buffer size and create the buffer
        int bufferSize = sound.getLength();
        // System.out.println(bufferSize);
        byte[] buffer = new byte[bufferSize];
        // Create a new data line to write the samples onto
        DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
        line = (SourceDataLine) AudioSystem.getLine(info);
        // Open and start playing on the line
        try {
            if (!line.isOpen()) {
                line.open();
            }
            line.start();
        } catch (Exception e){}
        // The total bytes read
        int numBytesRead = 0;
        boolean running = true;
        while (running) {
            // Destroy this player if the sound is destroyed
            if (sound.getState() == SoundState.STATE_DESTROYED) {
                running = false;
                // Release the line and release any resources used
                line.drain();
                line.close();
            }
            // Write the data only if the sound is playing or looping
            if ((sound.getState() == SoundState.STATE_PLAYING)
                    || (sound.getState() == SoundState.STATE_LOOPING)) {
                numBytesRead = is.read(buffer, 0, buffer.length);
                if (numBytesRead != -1) {
                    line.write(buffer, 0, numBytesRead);
                } else {
                    // The samples are ended. So reset the position of the
                    // stream
                    is.reset();
                    // If the sound is not looping, stop it
                    if (sound.getState() == SoundState.STATE_PLAYING) {
                        sound.setState(SoundState.STATE_STOPPED);
                    }
                }
            } else {
                // Not playing. so wait for a few moments
                Thread.sleep(Math.min(1000 / Global.FRAMES_PER_SECOND, 10));
            }
        }
    } catch (Exception e) {
        // Do nothing
    }
}

私が得るエラーメッセージは次のとおり です。 218) で java.io.BufferedInputStream.read(BufferedInputStream.java:237) で java.io.DataInputStream.readInt(DataInputStream.java:370) で com.sun.media.sound.WaveFileReader.getFMT(WaveFileReader.java:224) ) stm.sounds.WavPlayer.loadSound(WavPlayer.java: 42) stm.STM.(STM.java:265) at stm.STM.main(STM.java:363)"

4

2 に答える 2

2

おそらく、この行のファイル パスは正しくありません。

WavPlayer sound1 = WavPlayer.loadSound("coin.wav");

名前だけでなく、 「coin.wav」ファイルのパスを渡す必要があります。

たとえば、プロジェクトのルートのすぐ下にあるとしましょう、sounds という名前のフォルダーの下にある場合、そのパラメーターは「sounds/coin.wav」である必要があります。

于 2013-10-05T22:21:14.660 に答える
0

問題は静的メソッドにありますloadSound。このメソッドはnull、例外がスローされると戻ります。あなたはそれを捕まえますが、あなたはそれで何もしません。

  • 決して空のキャッチをしないでください。
  • 特定の例外をキャッチします。

メソッドの署名を次のように変更しloadSoundます

public static WavSound loadSound(String s) throws Exception // rather than exception specific exception!!

そして、あなたの方法なしtry-catch

于 2013-10-05T22:22:33.947 に答える