是否可以从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。这个问题有什么解决方案吗?
发布于 2012-05-15 06:34:10
使用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()变体有时会返回一个non-repositionable流。
发布于 2012-05-15 06:35:02
你不能施展它。在Java中,仅当您正在强制转换的真实对象已经是目标类型的实例时,引用类型上的类型强制转换才有效。例如:
String myString = new String("42");
Object obj = (Object) myString; // OK
String mystery = (String) obj; // OK
String mystery2 = (Integer) obj; // FAIL前两个成功是因为我们在第一行中创建的string对象是Object的实例(因为String是Object的子类型)和String的实例。第三个失败是因为String不是Integer。
在您的示例中,从getSystemResourceAsStream获得的对象是一个包含(假设)音频数据的原始流。它不是音频流;即不是AudioInputStream的实例。
您必须包装原始输入流,如下所示:
InputStream in = ClassLoader.getSystemResourceAsStream(
"sounds/"+filename+".wav");
AudioFormat format = ...
int length = ...
AudioInputStream audio = new AudioInputStream(in, format, length);或者使用AudioSystem.getAudioInputStream(...)工厂方法之一,它在引擎盖下进行包装。
有关正确方法的详细信息,请参阅Andrew Thomson的答案。
发布于 2012-05-15 06:33:32
getSystemResourceAsStream返回的InputStream不是AudioInputStream,因此强制转换它永远不会起作用。只需创建一个新的AudioInputStream即可。
https://stackoverflow.com/questions/10591852
复制相似问题