2015-11-20 76 views
1

我已經實現了一個簡單的Java聲音播放器(.wav),效果很好,除了播放50-60個聲音之後它就停止工作。在Java中播放聲音後不久停止工作

的代碼類似於Playing .mp3 and .wav in Java?,但我會在這裏發佈我的反正:

import java.io.BufferedInputStream; 
import java.io.InputStream; 
import java.net.URL; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.Clip; 

public class NewWavPlayer { 
    private URL url; 
    private AudioInputStream audio; 

    public NewWavPlayer(URL url) { 
     this.url = url; 
    } 

    public void play() { 
      try 
      { 
      InputStream audioSrc = url.openStream(); 
      InputStream bufferedIn = new BufferedInputStream(audioSrc); 
      audio = AudioSystem.getAudioInputStream(bufferedIn);    
      Clip clip = AudioSystem.getClip(); 
      clip.open(audio); 
      clip.start(); 
      } catch(Exception e) { 
       System.err.println(e); 
      } 
    } 
} 

的錯誤,我得到過了一會是:

javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 44100.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian not supported. 

javax.sound.sampled.LineUnavailableException: line with format PCM_UNSIGNED 22050.0 Hz, 8 bit, mono, 1 bytes/frame, not supported. 

但它沒有任何意義,因爲之前播放過相同的聲音(或其他已播放的聲音d正確)。我在Linux Ubuntu 15.04上運行它,其他用戶也經歷過與其他SO相同的操作。

我試着用線程重新實現它,但我得到了同樣的錯誤。我想知道下一步應採取哪些措施。

回答

0

我發現代碼的問題。經過一番研究後,我發現關閉剪輯的方法就是要走了。我得到了代碼從這裏:https://stackoverflow.com/a/17277981/3552500

final Clip clip = AudioSystem.getClip(); 
clip.addLineListener(new LineListener() { 
    @Override 
    public void update(LineEvent event) { 
     if (event.getType() == LineEvent.Type.STOP) 
      clip.close(); 
    } 
});  
0

我看到的一件事是你沒有關閉你的InputStreams。你可能沒有把手。在finally子句中關閉輸入流,即

public void play() { 
     InputStream audioSrc = null; 
     InputStream bufferedIn = null; 
     try { 
     audioSrc = url.openStream(); 
     bufferedIn = new BufferedInputStream(audioSrc); 
     audio = AudioSystem.getAudioInputStream(bufferedIn);    
     Clip clip = AudioSystem.getClip(); 
     clip.open(audio); 
     clip.start(); 
     } catch(Exception e) { 
      System.err.println(e); 
     } finally { 
      if (bufferedIn != null) { 
       bufferedIn.close(); 
      } 
      if (audioSrc != null) { 
       audioSrc.close(); 
      } 
} 

如果您的操作系統用完了句柄,則可能必須重新啓動系統。以上將確保它不會再發生。

希望這會有所幫助!

+0

或者你可以讓你的生活更簡單,使用[試戴與資源聲明】(https://docs.oracle.com/javase/tutorial/essential/例外/ tryResourceClose.html) – MadProgrammer

+0

這是一個不錯的提示,但不幸的是它不適合我。錯誤仍然存​​在。當我再次運行應用程序(通過Eclipse或作爲外部的.jar)時,它會再次運行,直到50-60次(我計算)再現聲音後突然停止。 – Chaotic

+0

它聽起來像你的操作系統沒有用完了。我會建議添加最後的子句,重新啓動並查看問題是否存在。最糟糕的是,這將消除這一理論。只是一個建議:) – Kabir