java - 重置从文件加载的 Java AudioInputStream

标签 java audio

我的程序的一部分需要加载声音并在提示时播放它们。 目前,我支持加载已作为资源“嵌入”到项目中的 .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)....

这是为什么呢? 我应该如何解决这个问题?

最佳答案

为什么要将 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()

关于java - 重置从文件加载的 Java AudioInputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38358118/

相关文章:

java - Android 布局不一致

java - (JAVA) System.in 上的终止函数 .. 可能吗?

java - Tomcat 使用供应商推荐的不同 JDK 时出现的问题

java - 如何在android sdk上使用PowerMock

java - 检查 Java 中的 MySQL DB 中是否存在值?

batch-file - 批量退出时停止背景音频以及如何定界循环

audio - 用于开发音频混合Web应用程序的平台是什么?

java - 在 MIDI 音序器中控制音量的方法是什么?

javascript - scriptNode.onaudioprocess 已弃用,还有其他选择吗?

java - Android 音频录制与处理