如何从InputStream转换为AudioInputStream

Val*_* Ru 3 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();
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

我用它来运行它

new Thread(new SoundThread("nameOfTheSoundFile")).start();
Run Code Online (Sandbox Code Playgroud)

一开始我使用sun.audio.AudioPlayer和sun.audio.AudioStream处理它,但是一旦我将代码放在eclipse中,它就会向我显示错误.所以我试过了

AudioInputStream in = (AudioInputStream)ClassLoader.getSystemResourceAsStream("sounds/"+filename+".wav");
Run Code Online (Sandbox Code Playgroud)

将InputStream强制转换为AudioInputStream(eclipse没有显示任何错误),但运行它会引发ClassCastException.这个问题有什么解决方案吗?

And*_*son 7

使用AudioSystemAudioInputStream直接从URL资源获取.

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

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