2016-06-21 14 views
2

.wavファイルを開いてクリップを使用して再生しようとしています。しかし、私がmyClip.open(...)を呼び出すと、スレッドはフリーズし、決して再開しません。エラーはスローされません。Java clip.openが無期限にハングアップする

try { 
    AudioInputStream mySound = AudioSystem.getAudioInputStream(new File("sounds/myAudioFile.wav")); 
    myClip = AudioSystem.getClip(); 
    myClip.open(mySound); //This is where it hangs 
    myClip.start(); //This is never executed 
} catch (Exception e) {e.printStackTrace();} 

EDIT: 私のコードの代替バージョン(も動作しません):

Clip myClip = null; 

new Thread(new Runnable() { 
    public void run() { 
      try { 
       AudioInputStream mySound = AudioSystem.getAudioInputStream(new File("sounds/myAudioFile.wav")); 
       myClip = AudioSystem.getClip(); 
       System.out.println("Before open"); 
       myClip.open(mySound); //This is where it hangs 
       System.out.println("After open"); //never executed 
       //This thread runs indefinitely, whether or not clip.start() is called 
      } catch (Exception e) {e.printStackTrace();} 
    } 
}).start(); 

try{ Thread.sleep(1000); }catch(Exception e){} //give it a second to open 

myClip.start(); //Executed, but doesn't make a sound 
System.out.println("Started clip"); 

出力:

Before open 
Started clip 
ここに私のコードのシンプルなバージョンがあります

私はこれを引き起こす原因を知っていますが、スレッドが永遠に凍結する方法を理解することはできません。コンピュータのサウンドドライバが動作を停止することがあり、プログラムからのサウンドが再生されないようにするため、フリーズします。私は、clip.openメソッド(またはスレッド)を強制的に2〜3秒後にタイムアウトさせる何らかの方法が必要です。 別のスレッドのclip.start()の呼び出しは機能しますが、クリップが開かれていないためサウンドは再生されません。 clip.open(...)を含むスレッドは、clip.start()を呼び出した後も永遠に実行されます。

+0

スレッドで書き込もうとします。それ以外の場合、メインスレッドはブロックされ、フリーズするように感じます。 – Boola

答えて

0
public static synchronized void playSound(final String url) { 
    new Thread(new Runnable() { 
    // The wrapper thread is unnecessary, unless it blocks on the 
    // Clip finishing; see comments. 
    public void run() { 
     try { 
     Clip clip = AudioSystem.getAudioInputStream(new File("sounds/myAudioFile.wav"));  // you can pass it in url 
     clip.open(inputStream); 
     } catch (Exception e) { 
     System.err.println(e.getMessage()); 
     } 
    } 
    }).start(); 
} 

もう1点: クリップを開始していません。 use clip.start() この場合、clip.start()は新しいスレッド自体を生成するので、別のスレッドを使用する必要はありません。

+0

それは私の凍結問題を解決しますが、それはまた決して終わらない新しいスレッドを作成します。それは問題ではないと思いますよね? –

+0

私はすでにそれを避ける方法を書いた。 clip.start()を使用するとすぐに、新しいスレッドが生成されます。あなたのコードの実際の問題は、あなたがクリップを開いているに過ぎませんが、それを開始することはありません。クリップが開始するのを待ちます。 – Boola

+0

なぜ私はそれが機能しないのかを特定するために私の投稿を編集しました。 (私はわからないけれども、それはあなたの問題を解決したりしません): –

関連する問題