我有这段代码可以播放给定声音文件中的声音:
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 问题。
最佳答案
我是通过一个最近遇到同样问题的人的链接看到这篇文章的。关于示例代码为何不起作用,我没有答案。我觉得一切都很好。
我只是想建议尝试新编码的 AudioCue (BSD 类型许可证)作为替代。它的行为非常像 Clip,但有一些优点。数据被加载到一个 float 组中并通过 SourceDataLine 输出。实现只有三个类,其中两个用于添加线路监听功能。作为奖励,它支持并发播放,以及音量、声像和音高的实时衰减。它仅适用于立体声 44100 16 位格式(“CD 质量”)或直接加载遵循该格式的 float 组。
我很好奇它是否可以在 Ubuntu 上运行。由于它通过 SourceDataLine 播放,因此它应该可以在常用的 Java 平台上运行。
关于java - 某些剪辑停在第 44100 帧 - Java 声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22997800/