2013-12-14 53 views
2

我正在创建一个2D Java平台游戏,我试图让音频从.wav文件播放游戏运行时...java.io.IOException:标记/重置不支持Java音频输入流/缓冲输入流

下面是我创建采取加载资源转换成音频输入流

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中的资源包内。字符串s代表.jar文件的本地文件路径。我会创建一个音频播放器对象,如下所示: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); 
     /************/ 

喜欢的东西:

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

它会工作,因为getResourceAsStream通常返回一个非重新定位的输入流,而如果你提供的URL AudioSystem,它可以根据URL所需建立尽可能多的流,或将其封装在可重定位的流中。

+0

这似乎解决了我的问题。谢谢! – Steve