2013-12-14 2 views
2

2D Java Platform 게임을 만드는 중이며 .wav 파일에서 재생할 오디오를 가져 오려고합니다. 게임이 실행되는 동안 ... 아래 java.io.IOException : mark/reset는 지원되지 않습니다. Java 오디오 입력 스트림/버퍼 된 입력 스트림

내가 오디오 입력 스트림 I 컴파일하고 소스 코드에서 직접 게임을 실행

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(); 
    } 
} 

에 자원을로드 돌봐 만든 AudioPlayer 클래스입니다 , 오디오 잘 작동하지만 .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 = new AudioPlayer ("/ resources/audio/bgmusic/bgmusic.wav"); – Steve

답변

4

변경 :

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

같은 사람 : getResourceAsStream는 일반적으로 비 재배치 가능한 입력 스트림을 반환하기 때문에

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

그것은 작동합니다 당신이 AudioSystem의 URL을 제공하는 경우, 그것을 할 수있는 반면, URL에서 원하는만큼의 스트림을 설정하거나 재 배치 가능한 스트림으로 래핑하십시오.

+0

이것은 내 문제를 해결 한 것 같습니다. 감사! – Steve