我有这个代码用于播放给定声音文件中的声音:
public class SoundPlayer {
private Clip clip;
private String sound = "bomb.wav";
public SoundPlayer() {
try {
clip = loadClip();
} catch (LineUnavailableException e) {
e.printStackTrace();
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private Clip loadClip() throws LineUnavailableException, UnsupportedAudioFileException, IOException{
AudioInputStream audio = AudioSystem.getAudioInputStream(this.getClass().getResource(sound));
AudioFormat format = audio.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, format);
final Clip clip = (Clip) AudioSystem.getLine(info);
clip.open(audio);
clip.addLineListener(new LineListener() {
@Override
public void update(LineEvent event) {
System.out.println(event);
System.out.println(clip.getFramePosition());
}
});
return clip;
}
public void playSound(){
System.out.println(clip.getFrameLength());
clip.start();
}
public static void main(String[] args) throws InterruptedException{
SoundPlayer sp = new SoundPlayer();
Thread.sleep(2000); //Let open the file
sp.playSound();
Thread.sleep(10000); //Wait for the playback to finish
}
}
它播放一些没有声音和问题但是播放一些声音(爆炸炸弹的声音)效果不佳。对于这些炸弹声,播放总是在第44100帧停止,我不明白为什么。
我添加了调试代码以跟踪正在播放的帧。第一个数字是帧长度,第二个是剪辑开始时的帧,最后一个是停止时的帧位置。
播放炸弹声音的输出:
72846
Start event from line com.sun.media.sound.DirectAudioDevice$DirectClip@659bd1ca
44099
Stop event from line com.sun.media.sound.DirectAudioDevice$DirectClip@659bd1ca
44100
我在这里上传了爆炸声:
http://speedy.sh/v5QTy/bomb.wav
http://speedy.sh/nxysB/explosion.wav
播放正常的声音:
http://speedy.sh/NzBJr/adios.wav
编辑:这只发生在Linux上 - 带有Oracle JDK 1.7.0_51的Ubuntu 12.04
是否有另一个易于使用的声音API(与java.sound不同)真的没有跨平台问题?这不是我在Linux下使用java.sound的第一个问题。
答案 0 :(得分:0)
我通过来自最近有同样问题的人的链接发现了这篇文章。我没有答案为什么示例代码不起作用。这对我来说都很好看。
我只是想建议尝试新编码的AudioCue(BSD类型许可证)作为替代方案。它的行为非常像Clip,但有一些优点。数据被加载到float数组中并通过SourceDataLine输出。实现只有三个类,其中两个用于添加行侦听功能。作为奖励,它支持并发播放,以及音量,平移和音调的实时淡入。它仅适用于立体声44100 16位格式(“CD质量”)或直接加载的浮点数,遵循该格式。
我很好奇它是否适用于Ubuntu。由于它通过SourceDataLine播放,因此它应该适用于通常的Java平台。