【问题标题】:java.io.IOException: mark/reset not supported Java Audio Input Stream / Buffered Input Streamjava.io.IOException:不支持标记/重置 Java 音频输入流/缓冲输入流
【发布时间】: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


【解决方案1】:

变化:

        /************/
        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 建立任意数量的流,或者将其包装在一个可重新定位的流。

【讨论】:

  • 这似乎解决了我的问题。谢谢!
猜你喜欢
  • 2023-04-09
  • 2012-01-25
  • 1970-01-01
  • 2013-09-18
  • 2014-02-03
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
相关资源
最近更新 更多