2013-12-14 3 views
2
.

. Я нахожусь в создании 2D-платформы Java Platform. Я пытаюсь получить аудио для воспроизведения из файла .wav. в то время как игра работает ...java.io.IOException: отметка/сброс не поддерживается. Входной поток аудиовидеопотока. Буферный входной поток.

Ниже приводится AudioPlayer класс я создал, чтобы заботиться о загрузке ресурса в аудиовхода поток

import javax.sound.sampled.*; 
import java.io.*; 
import java.util.*; 
import java.net.*; 

public class AudioPlayer { 

    private Clip clip; 

    public AudioPlayer(String s) { 

     try { 

      /************/ 
      InputStream is = getClass().getResourceAsStream(s); 
      AudioInputStream ais; 
      BufferedInputStream bis = new BufferedInputStream(is); 
      ais = AudioSystem.getAudioInputStream(bis); 
      /************/ 

      AudioFormat baseFormat = ais.getFormat(); 

      AudioFormat decodeFormat = new AudioFormat(
      AudioFormat.Encoding.PCM_SIGNED, 
      baseFormat.getSampleRate(), 
      16, 
      baseFormat.getChannels(), 
      baseFormat.getChannels() * 2, 
      baseFormat.getSampleRate(), 
      false); 

      AudioInputStream dais = AudioSystem.getAudioInputStream(decodeFormat, ais); 
      clip = AudioSystem.getClip(); 
      clip.open(dais); 
     } 
     catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void play() { 
     if(clip == null) return; 
     stop(); 
     clip.setFramePosition(0); 
     clip.start(); 
    } 

    public void stop() { 
     if(clip.isRunning()) clip.stop(); 
    } 

    public void toggle() { 
     if(clip.isRunning()) { 
      clip.stop(); 
     } 
     else { 
      clip.start(); 
     } 
    } 
    public void close() { 
     stop(); 
     clip.close(); 
    } 
} 

Когда я скомпилировать и запустить игру непосредственно из исходного кода , звук работает нормально, но когда я пытаюсь сжать файлы в формате .jar и запустить файл .jar, я получаю ошибку:

java.io.IOException: mark/reset not supported 
    at java.util.zip.InflaterInputStream.reset(Unknown Source) 
    at java.io.FilterInputStream.reset(Unknown Source) 
    at com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(Unknown Source) 
    at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source) 
    at audio.AudioPlayer.<init><AudioPlayer.java:18) 
    ... 

Я не уверен, правильно ли настроил буферный поток ввода для игры в формате .jar.

Любые мысли о том, как решить эту проблему, будут высоко оценены.

Спасибо!

+0

Этот файл вы пытаетесь воспроизвести в файле jar? – Nishan

+0

Да. WAV-файл находится внутри пакета ресурсов в .jar. String s представляет локальный путь к файлу .jar. Я бы создал объект Audio Player следующим образом: bgMusic = новый AudioPlayer («/ resources/audio/bgmusic/bgmusic.wav»); – Steve

ответ

4

Изменение:

 /************/ 
     InputStream is = getClass().getResourceAsStream(s); 
     AudioInputStream ais; 
     BufferedInputStream bis = new BufferedInputStream(is); 
     ais = AudioSystem.getAudioInputStream(bis); 
     /************/ 

Чтобы что-то вроде:

 /************/ 
     URL url = getClass().getResource(s); 
     AudioInputStream ais; 
     ais = AudioSystem.getAudioInputStream(url); 
     /************/ 

Это будет работать, потому что getResourceAsStream обычно возвращает поток, не перемещаемый вход, в то время как если вы предоставите URL в AudioSystem, он может установить столько потоков, сколько захочет из URL-адреса, или обернуть их в репозиционируемый поток.

+0

Это, похоже, устранило мою проблему. Благодаря! – Steve

 Смежные вопросы

  • Нет связанных вопросов^_^