2

私は自分のプログラムを修正するために何日も働いてきました。一度曲を再生することはできますが、その曲を再再生することはできません。

奇妙なことに、自己完結型の短い例を作成しようとすると、同じコードで曲を再生し、停止してから別の曲を再生できますが、同じ曲を 2 回続けて再生することはできないことがわかりました。私のアプリでは、ユーザーが同じ曲をもう一度選択するかどうかわからないため、ストリームを閉じて再度開く必要があります。

これは、壊れたコードを示す例です (曲を再度再生しません):

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

public class test{
    static Clip musicplayer;
    static AudioInputStream currentSong;

    public static void main(String[] args){
        try{
            musicplayer = AudioSystem.getClip();
            AudioInputStream ais = AudioSystem.getAudioInputStream(new test().getClass().getResource("test.wav")); 
            playMusic(ais);
            System.out.println("Playing Music");
            Thread.sleep(4000);
            stopMusic();
            System.out.println("Stopping Music");
            Thread.sleep(3000);
            playMusic(ais);
            System.out.println("Playing Music for the Second time");
            Thread.sleep(5000);
            System.out.println("Finished Program");
        }catch(Exception ex){ex.printStackTrace();}
    }

    public static void playMusic(AudioInputStream music){
         if(music == null)
             return;

         if(currentSong != null){
             if(currentSong.equals(music))
                 return;
         }

         currentSong = music;

         try {  
               musicplayer.setFramePosition(0);
               musicplayer.stop();
               musicplayer.open(currentSong);    
        } catch (LineUnavailableException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } 
        musicplayer.loop(Clip.LOOP_CONTINUOUSLY);
    }

    public static void stopMusic(){
        musicplayer.close();            
    }
}

別の AudioInputStream を追加して、それを 2 番目の曲として再生すると、問題なく動作します。

4

1 に答える 1

2

このコードには 2 つの問題があります

現在の曲は決してリセットされないため、同じストリームを 2 回再生しようとすると、中止されます。

...
     if(currentSong != null){
         if(currentSong.equals(music))
             return;
     }

...

それをクリアする。

public static void stopMusic(){
    musicplayer.close();            
    currentSong = null;  // we do not have a current song anymore.
}

もう 1 つの問題は、入力ストリームをリセットしていないことです。最も簡単な方法は、それをリロードすることです。ストリームは、何かに与えることができる配列ではなく、魔法のように最初から開始されます。Stream にアクセスするものは、次のものだけを取得できます。次のビットが最後である Stream を指定すると、何も起こりません。

    AudioInputStream ais = AudioSystem.getAudioInputStream(new test().getClass().getResource("test.wav")); 
    playMusic(ais);

    ais = AudioSystem.getAudioInputStream(new test().getClass().getResource("test.wav")); 
    playMusic(ais);

注意すべきことの 1 つは、AudioInputStream が equals を実装していないことです。

 AudioSystem.getAudioInputStream(new test().getClass().getResource("test.wav")).equals( AudioSystem.getAudioInputStream(new test().getClass().getResource("test.wav")))

false と評価されます。

于 2013-03-27T20:57:10.550 に答える