某些剪辑在第44100帧停止 - Java声音

时间:2014-04-10 19:57:16

标签: java audio

我有这个代码用于播放给定声音文件中的声音:

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的第一个问题。

1 个答案:

答案 0 :(得分:0)

我通过来自最近有同样问题的人的链接发现了这篇文章。我没有答案为什么示例代码不起作用。这对我来说都很好看。

我只是想建议尝试新编码的AudioCue(BSD类型许可证)作为替代方案。它的行为非常像Clip,但有一些优点。数据被加载到float数组中并通过SourceDataLine输出。实现只有三个类,其中两个用于添加行侦听功能。作为奖励,它支持并发播放,以及音量,平移和音调的实时淡入。它仅适用于立体声44100 16位格式(“CD质量”)或直接加载的浮点数,遵循该格式。

我很好奇它是否适用于Ubuntu。由于它通过SourceDataLine播放,因此它应该适用于通常的Java平台。