当前位置: 首页 > 知识库问答 >
问题:

Java音频流关闭错误

卢健
2023-03-14

我正在尝试为我正在制作的游戏添加声音,但每次尝试加载声音时,我都会收到流关闭异常。我不明白为什么会这样。

加载声音:

public class WavPlayer extends Thread {

/*
 * @param s The path of the wav file.
 * @return The sound data loaded into the WavSound object
 */
public static WavSound loadSound(String s){
    // Get an input stream
    InputStream is = WavPlayer.class.getClassLoader().getResourceAsStream(s);
    AudioInputStream audioStream;
    try {
        // Buffer the input stream
        BufferedInputStream bis = new BufferedInputStream(is);
        // Create the audio input stream and audio format
        audioStream = AudioSystem.getAudioInputStream(bis); //!Stream Closed Exception occurs here
        AudioFormat format = audioStream.getFormat();
        // The length of the audio file
        int length = (int) (audioStream.getFrameLength() * format.getFrameSize());
        // The array to store the samples in
        byte[] samples = new byte[length];
        // Read the samples into array to reduce disk access
        // (fast-execution)
        DataInputStream dis = new DataInputStream(audioStream);
        dis.readFully(samples);
        // Create a sound container
        WavSound sound = new WavSound(samples, format, (int) audioStream.getFrameLength());
        // Don't start the sound on load
        sound.setState(SoundState.STATE_STOPPED);
        // Create a new player for each sound
        new WavPlayer(sound);
        return sound;
    } catch (Exception e) {
        // An error. Mustn't happen
    }
    return null;
}

// Private variables
private WavSound sound = null;

/**
 * Constructs a new player with a sound and with an optional looping
 * 
 * @param s The WavSound object
 */
public WavPlayer(WavSound s) {
    sound = s;
    start();
}

/**
 * Runs the player in a separate thread
 */
@Override
public void run(){
    // Get the byte samples from the container
    byte[] data = sound.getData();
    InputStream is = new ByteArrayInputStream(data);
    try {
        // Create a line for the required audio format
        SourceDataLine line = null;
        AudioFormat format = sound.getAudioFormat();
        // Calculate the buffer size and create the buffer
        int bufferSize = sound.getLength();
        // System.out.println(bufferSize);
        byte[] buffer = new byte[bufferSize];
        // Create a new data line to write the samples onto
        DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
        line = (SourceDataLine) AudioSystem.getLine(info);
        // Open and start playing on the line
        try {
            if (!line.isOpen()) {
                line.open();
            }
            line.start();
        } catch (Exception e){}
        // The total bytes read
        int numBytesRead = 0;
        boolean running = true;
        while (running) {
            // Destroy this player if the sound is destroyed
            if (sound.getState() == SoundState.STATE_DESTROYED) {
                running = false;
                // Release the line and release any resources used
                line.drain();
                line.close();
            }
            // Write the data only if the sound is playing or looping
            if ((sound.getState() == SoundState.STATE_PLAYING)
                    || (sound.getState() == SoundState.STATE_LOOPING)) {
                numBytesRead = is.read(buffer, 0, buffer.length);
                if (numBytesRead != -1) {
                    line.write(buffer, 0, numBytesRead);
                } else {
                    // The samples are ended. So reset the position of the
                    // stream
                    is.reset();
                    // If the sound is not looping, stop it
                    if (sound.getState() == SoundState.STATE_PLAYING) {
                        sound.setState(SoundState.STATE_STOPPED);
                    }
                }
            } else {
                // Not playing. so wait for a few moments
                Thread.sleep(Math.min(1000 / Global.FRAMES_PER_SECOND, 10));
            }
        }
    } catch (Exception e) {
        // Do nothing
    }
}

我收到的错误消息是:“线程”main“java.io.IOException中的异常:Stream closed at java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:134) at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) at java.io.BufferedInputStream.read(BufferedInputStream.java:237) at java.io.DataInputStream.readInt(DataInputStream.java:370) at com.sun.media.sound.WaveFileReader.getFMT(WaveFileReader.java:224) atcom.sun.media.sound.WaveFileReader.getAudioInputStream(WaveFileReader.java:140) at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1094) at stm.sounds.WavPlayer.loadSound(WavPlayer.java:42) at stm.STM.(STM.java:265)在STM。STM.main(STM.java:363)”

共有2个答案

庄元龙
2023-03-14

问题出在静态方法loadSound中。当抛出异常时,此方法返回<code>null</code>。你抓住了它,但你什么也不做,

    < li >不要空接。 < li >捕捉特定的异常。

我会将您的方法签名loadSound更改为

public static WavSound loadSound(String s) throws Exception // rather than exception specific exception!!

然后你的方法没有尝试捕获

童浩言
2023-03-14

很可能这行中的文件路径不正确:

WavPlayer sound1 = WavPlayer.loadSound("coin.wav");

您应该传递“coin.wav”文件的路径,而不仅仅是它的名称。

例如,如果它在一个名为sounds的文件夹下,比如说在项目的根目录下,那么该参数应该是“sounds/coin.wav”。

 类似资料:
  • 问题内容: 我正在另一台PC上实现从MIC到Java服务器的实时流传输。但是我只听到白噪声。 我已经附上了客户端程序和服务器程序 并且服务器端没有问题。它与android客户端AudioRecord完美运行。 问题答案: 因此,我用正弦波(或某种在某种意义上类似正弦波的东西)填充了麦克风,并且您的程序运行正常。 因此,我的具体更改是: 显然,我将其误解为一个512字节长的片段,并破坏了正弦波,但事

  • 我正在尝试读取文件中的一行,在喷口中,然后将其发送到螺栓,但我一直收到流关闭错误。我关闭错误还是这里有什么问题? 这是我遇到的错误: Java语言io。IOException:溪流在周日关闭。nio。反恐精英。StreamDecoder。ensureOpen(StreamDecoder.java:46)在sun上。nio。反恐精英。StreamDecoder。在java上读取(StreamDeco

  • 问题内容: 我已经看到多个有关MP3流(例如Icecast)的堆栈溢出问题。他们都说我使用的是MP3SPI库。MP3SPI用于允许支持mime类型。那就是我的Icecast流。我在类路径中正确地拥有了所有三个jar文件,但是在使用它们在示例中提供的相同代码时,我仍然得到了: 这是我的代码: 我的这个项目的开始脚本: 我的Icecast控制面板说它正在流式传输。通过在任何媒体播放器中打开代码中的UR

  • 问题内容: 我正在尝试建立一个程序来录制一部分互联网音频流,并将其保存到文件(最好是mp3或wav)。我到处都看过,找不到任何合适的方法来做到这一点。我找到了两个似乎可以工作的不同库(NativeBass和Xuggle),但我都不支持64位Windows。 有谁知道使用Java保存一部分互联网音频流的任何简单方法?(如果重要,则为“音频/ mpeg”流)。 编辑:好的,我发现了一种可行的方法。但是

  • 问题内容: 如果我们使用Java 8 Stream,例如何时关闭此流? 作为下一个示例,我们关闭流是不是一个好习惯? 问题答案: 通常根本不需要关闭流。您只需要关闭使用IO资源的流。 从Stream文档中: 流具有方法和实现,但是实际上几乎所有流实例在使用后都不需要关闭。通常,只有源是IO通道的流(例如由返回的)才需要关闭。大多数流都由集合,数组或生成函数支持,而无需特殊的资源管理。(如果流确实需

  • 如果我们使用Java8流,比如