[英]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 格式的媒体文件,但仍然遇到延迟。
这与我尝试使用 Audioclip 的情况类似,但我使用预定的执行程序来确定何时重播音频。 (我仍然经历了延迟)。
最后,我已经在 Audacity 中测试了我的音频,它们可以无缝过渡和循环播放。
对于这些类型的问题,有哪些推荐的解决方案?
编辑:
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.