java.io.IOException:标记/重置不支持的java音频输入流/缓冲输入流
我正在创建一个2D Java平台游戏,我试图在游戏运行时从一个.wav文件中获取音频播放 下面是我创建的AudioPlayer类,用于将资源加载到音频输入流中java.io.IOException:标记/重置不支持的java音频输入流/缓冲输入流,java,audio,stream,reset,javasound,Java,Audio,Stream,Reset,Javasound,我正在创建一个2D Java平台游戏,我试图在游戏运行时从一个.wav文件中获取音频播放 下面是我创建的AudioPlayer类,用于将资源加载到音频输入流中 import javax.sound.sampled.*; import java.io.*; import java.util.*; import java.net.*; public class AudioPlayer { private Clip clip; public AudioPlayer(String
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)
...
java.io.IOException:不支持标记/重置
位于java.util.zip.InflateInputStream.reset(未知源)
位于java.io.FilterInputStream.reset(未知源)
位于com.sun.media.sound.softmidiaAudioFileReader.getAudioInputStream(未知源)
位于javax.sound.sampled.AudioSystem.getAudioInputStream(未知源)
在audio.AudioPlayer上更改:
/************/
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
通常返回一个不可重新定位的输入流,而如果您向AudioSystem
提供URL,它可以根据需要从URL建立任意数量的流,或者将其包装在可重新定位的流中。是您试图在jar文件中播放的文件吗?是,.wav文件位于.jar中的资源包中。字符串s表示.jar文件的本地文件路径。我将创建一个音频播放器对象,如下所示:bgMusic=newaudioplayer(“/resources/Audio/bgMusic/bgMusic.wav”);这似乎解决了我的问题。谢谢