繁体   English   中英

Java 无缝音频转换/循环

[英]Java Seamless Audio Transition/Loop

您如何确保两段音频之间的过渡是无缝的?

在 JavaFX 应用程序中,我使用javafx.scene.media.MediaPlayer播放介绍片段,该片段由主/循环片段进行。 媒体播放得很好,但问题是过渡和循环。

这是我目前正在做的事情:

private static void foo(final Media intro, final Media loop) {
        final MediaPlayer introPlayer = new MediaPlayer(intro);
        introPlayer.play();

        final MediaPlayer loopPlayer = new MediaPlayer(loop);
        loopPlayer.pause(); //  An attempt to load the media so it will be ready to be played.

        introPlayer.setOnEndOfMedia(loopPlayer::play());

        loopPlayer.setOnEndOfMedia(() -> loopPlayer.seek(Duration.ZERO));
        //loopPlayer.setCycleCount(Integer.MAX_VALUE); // Similar to the above line, but there is still a delay between loops.
    }

MediaPlayer::pause 确实有帮助,但在介绍媒体的结束和循环媒体的开始之间有一个非常明显的延迟。 此外,在循环媒体结束和重复之间还有另一个明显的延迟。

我还尝试使用javafx.scene.media.AudioClip ,因为据说它的开销比javafx.scene.media.MediaPlayer少。 我写了自己的监听器来判断曲目何时结束(并立即开始循环播放),但我仍然看到类似的延迟。

以下是我发现的一些类似帖子,但没有提供解决问题的方法:

JavaFX MediaPlayer 播放带有小介绍音乐的背景音乐循环

这绝对是相关的(巧合的是,这几乎是那篇文章的周年纪念日),但我已经在使用 .wav 格式的媒体文件,但仍然遇到延迟。

JavaFX AudioClip.play()

这与我尝试使用 Audioclip 的情况类似,但我使用预定的执行程序来确定何时重播音频。 (我仍然经历了延迟)。

最后,我已经在 Audacity 中测试了我的音频,它们可以无缝过渡和循环播放。

对于这些类型的问题,有哪些推荐的解决方案?

编辑:

  1. 向代码块添加了附录,提到 MediaPlayer::setCycleCount(Integer)

AudioClip Javadocs声明 AudioClip 表示可以以最小延迟播放并立即可用的音频片段。 然而,它也指出

然而,媒体对象更适合长时间播放的声音。 这主要是因为 AudioClip 将整个声音的原始未压缩音频数据存储在内存中,这对于长音频剪辑来说可能非常大。 MediaPlayer 将只有足够的解压缩音频数据预卷在内存中以播放短时间,因此对于长剪辑,尤其是在压缩时,内存效率要高得多。

根据循环媒体的长度, AudioClip可能更适合您。 不需要ScheduledExecutorService来重播音频,您可以使用AudioClip.setCycleCount(AudioClip.INDEFINITE)永远循环。

使用此信息,我相信您最好的选择是使用MediaPlayer进行介绍,然后使用MediaPlayer#setOnEndOfMedia调用循环AudioClip 可能在介绍和循环转换之间有一个小的延迟,但之后是无缝的。

我意识到你发帖已经有一段时间了。 你找到答案了吗? 我想知道您loopPlayer在播放introPlayer之前加载了introPlayer ,如果这有帮助。

如果 MediaPlayer 的“侦听器”有点迟钝,也许切换到使用 Java 的SourceDataLine和用于触发循环提示的LineListener会更无缝地工作? (我会使用Clip进行循环播放。)

最后一个建议,我有一个可以为此工作的音频库AudioCue 该库包含一个AudioCueListener ,可以在提示结束时触发事件(例如开始另一个AudioCue播放)。 但是库的限制要求您将音乐保存在内存中,并且源文件是 .wav 的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM