java - 如何从 InputStream 转换为 AudioInputStream

标签 java audio casting inputstream javasound

是否可以从 InputStream 转换为 AudioInputStream?

我想在某些事件中播放小声音文件,所以我做了以下 SoundThread

import java.io.*;
import javax.sound.sampled.*;

public class SoundThread implements Runnable{

    private String filename;

    SoundThread(String filename) {
        this.filename = filename;
    }

    public void run() {
        try {
            InputStream in = ClassLoader.getSystemResourceAsStream("sounds/"+filename+".wav");
            Clip clip = AudioSystem.getClip();
            clip.open((AudioInputStream)in);
            clip.start();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (NullPointerException e) {
            e.printStackTrace();
        } catch (LineUnavailableException e){
            e.printStackTrace();
        } 
    }
}

我运行它

new Thread(new SoundThread("nameOfTheSoundFile")).start();

一开始我用 sun.audio.AudioPlayer 和 sun.audio.AudioStream 处理它,但是当我把代码放到 eclipse 中时,它显示错误。所以我尝试了

AudioInputStream in = (AudioInputStream)ClassLoader.getSystemResourceAsStream("sounds/"+filename+".wav");

将 InputStream 转换为 AudioInputStream(eclipse 未显示任何错误),但运行它会抛出 ClassCastException。这个问题有什么解决办法吗?

最佳答案

使用 AudioSystem 直接从资源的 URL 获取 AudioInputStream

URL url = ClassLoader.getResource("/sounds/"+filename+".wav");
AudioInputStream ais = AudioSystem.getAudioInputStream(url);
Clip clip = AudioSystem.getClip();
clip.open(ais);

另见 AudioSystem.getAudioInputStream(InputStream)但这是“更危险的”。 Java Sound 通常需要可重新定位的输入流。由于某些我不太清楚的原因,Class.getResourceAsStream() 变体有时会返回一个不可-repositionable 流。

关于java - 如何从 InputStream 转换为 AudioInputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10591852/

相关文章:

c++ - 从整数转换为指针

java - 迁移到 Spring Security 4 时出现访问被拒绝页面

java - Controller 的设计方法

java - 创建名称为 'springSecurityFilterChain' 的 bean 时出错

javascript - IE11 HTML5 无法播放 MP3 文件

haskell - 使用 Haskell 播放 wav 文件

java - Eclipse, ImageView 上的 View 布局

android - Matlab audioread/audioplay 通过 Coder 转换为 C/C++

c++ - Catch2 强制我将 std::string 的强制转换添加到我的异常中,这会产生其他问题吗?

c++ - Dynamic_cast 兼容性?