首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从InputStream转换到AudioInputStream

如何从InputStream转换到AudioInputStream
EN

Stack Overflow用户
提问于 2012-05-15 06:23:43
回答 3查看 11.1K关注 0票数 3

是否可以从InputStream转换为AudioInputStream?

我想在某些活动中播放一些声音文件,所以我做了下面的SoundThread

代码语言:javascript
复制
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();
        } 
    }
}

我用来运行它

代码语言:javascript
复制
new Thread(new SoundThread("nameOfTheSoundFile")).start();

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

代码语言:javascript
复制
AudioInputStream in = (AudioInputStream)ClassLoader.getSystemResourceAsStream("sounds/"+filename+".wav");

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-15 06:34:10

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

代码语言:javascript
复制
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()变体有时会返回一个non-repositionable流。

票数 7
EN

Stack Overflow用户

发布于 2012-05-15 06:35:02

你不能施展它。在Java中,仅当您正在强制转换的真实对象已经是目标类型的实例时,引用类型上的类型强制转换才有效。例如:

代码语言:javascript
复制
    String myString = new String("42");
    Object obj = (Object) myString;  // OK
    String mystery = (String) obj;   // OK
    String mystery2 = (Integer) obj; // FAIL

前两个成功是因为我们在第一行中创建的string对象是Object的实例(因为StringObject的子类型)和String的实例。第三个失败是因为String不是Integer

在您的示例中,从getSystemResourceAsStream获得的对象是一个包含(假设)音频数据的原始流。它不是音频流;即不是AudioInputStream的实例。

您必须包装原始输入流,如下所示:

代码语言:javascript
复制
    InputStream in = ClassLoader.getSystemResourceAsStream(
        "sounds/"+filename+".wav");
    AudioFormat format = ...
    int length = ...
    AudioInputStream audio = new AudioInputStream(in, format, length);

或者使用AudioSystem.getAudioInputStream(...)工厂方法之一,它在引擎盖下进行包装。

有关正确方法的详细信息,请参阅Andrew Thomson的答案。

票数 1
EN

Stack Overflow用户

发布于 2012-05-15 06:33:32

getSystemResourceAsStream返回的InputStream不是AudioInputStream,因此强制转换它永远不会起作用。只需创建一个新的AudioInputStream即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10591852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档