2015-11-20 4 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. Возможно, у вас закончились ручки. Закройте входные потоки в пункте, наконец, т.е.

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/ exceptions/tryResourceClose.html) – MadProgrammer

+0

Это хороший совет, но, к сожалению, это не сработало для меня. Ошибка сохраняется. Когда я снова запускаю приложение (через Eclipse или как .jar), он снова работает, пока он не перестанет воспроизводить звук примерно 50-60 раз (я считаю). – Chaotic

+0

Звучит так, как будто у вашей ОС заканчиваются ручки. Я бы рекомендовал добавить предложения finally, перезагрузиться и посмотреть, существует ли проблема. В худшем случае это устранит эту теорию. Просто предложение :) – Kabir