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

标签 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 问题。

最佳答案

我是通过一个最近遇到同样问题的人的链接看到这篇文章的。关于示例代码为何不起作用,我没有答案。我觉得一切都很好。

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

我很好奇它是否可以在 Ubuntu 上运行。由于它通过 SourceDataLine 播放,因此它应该可以在常用的 Java 平台上运行。

关于java - 某些剪辑停在第 44100 帧 - Java 声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22997800/

相关文章:

python - 在 Python 中读取 *.wav 文件

Java 垃圾收集到哈希表

java - apache httpclient 4.5.1 仅与非 ssl 站点建立 SSL 连接,但失败

delphi - 在delphi中读取和播放Wav文件

c++ - MMDevice API 中的 CoCreateInstance 返回错误代码 0x800401F0

audio - 如何从Arduino的FM调谐器屏蔽获取音频或如何获取音频

java - 有效地计算记录列表中的项目

java - JPanel 不重绘

java - 在模拟器中打开后,Android应用程序崩溃

android - 如何在android中将两个音频文件合并为一个音频文件?