我的程序的一部分需要加载声音并在提示时播放它们。 目前我支持加载我已“嵌入”作为项目资源的.wav文件。为此,我使用一行代码:
sounds[i+1] = AudioSystem.getAudioInputStream(MyProject.class.getResource("filename.wav"));
我的下一个目标是允许用户加载自己的.wav文件进行播放。为此,我使用一行代码:
sounds[i+1] = AudioSystem.getAudioInputStream(new File("filename.wav"));
现在问题来了。当然,我希望能够不止一次地播放这些声音。在我最初的方法中,我使用了:
sound.markSupported();
sound.mark(Integer.MAX_VALUE);
/* do stuff with it */
sound.reset();
这完全没问题。但是,对于我通过“定期”加载文件创建的音频流(上面的第二种方法),它不起作用(在调用reset()时崩溃)。
我收到的错误是
java.io.IOException: mark/reset not supported
at java.io.InputStream.reset(InputStream.java:348)
at javax.sound.sampled.AudioInputStream.reset(AudioInputStream.java:427)....
为什么? 我该怎么办呢?
答案 0 :(得分:1)
为什么将Streams存储在sounds[]
数组中。只需保存信息如何创建流。这样做的方法如下:
public abstract class AudioSource {
public abstract InputStream getStream() throws IOException;
}
public class FileAudioSource extends AudioSource {
private final File audioFile;
public FileAudioSource(File audioFile) {
this.audioFile = audioFile;
}
@Override
public InputStream getStream() throws FileNotFoundException {
return new FileInputStream(audioFile);
}
}
public class ResourceAudioSource extends AudioSource {
private final String resourceName;
public ResourceAudioSource(String resourceName) {
this.resourceName = resourceName;
}
@Override
public InputStream getStream() {
return this.getClass().getResourceAsStream(resourceName)
}
}
最后,您可以创建列表:
sounds[i+1] = new ResourceAudioSource("resource_filename.wav");
sounds[i+1] = new FileAudioSource(new File("filename.wav"));
如果您需要该流,请拨打sounds[j].getStream()
。