【发布时间】:2014-01-02 00:28:55
【问题描述】:
我正在创建一个 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 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 格式运行。
任何关于如何解决此问题的想法将不胜感激。
谢谢!
【问题讨论】:
-
您要播放的文件是否在 jar 文件中?
-
是的,.wav 文件位于 .jar 的资源包中。字符串 s 表示 .jar 文件的本地文件路径。我将创建一个音频播放器对象,如下所示: bgMusic = new AudioPlayer("/resources/audio/bgmusic/bgmusic.wav");
标签: java audio stream reset javasound