Java 无缝音频转换/循环

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


在 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 中测试了我的音频,它们可以无缝地转换和循环播放。


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


编辑:


在代码块中添加了一个附录,提到 MediaPlayer::setCycleCount(Integer)

爪哇

声音的

javafx

java-8

音频播放器


互换的青春
浏览 159回答 2
2回答

临摹微笑

我知道你发帖已经有一段时间了。你找到答案了吗?我想知道你是否loopPlayer在玩之前加载introPlayer,如果这会有所帮助。如果 MediaPlayer 的“监听器”有点迟钝,也许切换到使用 JavaSourceDataLine来LineListener触发循环提示会更加无缝?(我会使用 aClip循环播放。)最后一个建议,我有一个可以为此工作的音频库AudioCue。该库包括一个可以在提示结束时AudioCueListener触发事件(例如开始另一个播放)的事件。AudioCue但是库的限制要求您将音乐保存在内存中,并且源文件是 .wav 的。

白衣非少年

是,它也指出然而,媒体对象更适合长时间播放的声音。这主要是因为 AudioClip 将整个声音的原始未压缩音频数据存储在内存中,对于长音频剪辑来说,这些数据可能非常大。MediaPlayer 将仅在内存中预滚动足够的解压缩音频数据以在短时间内播放,因此对于长剪辑来说内存效率要高得多,尤其是在它们被压缩的情况下。根据循环媒体的长度,anAudioClip可能更适合您。不需要 aScheduledExecutorService来重播音频,您可以使用AudioClip.setCycleCount(AudioClip.INDEFINITE)to 永远循环。使用此信息,我相信您最好的选择是使用 aMediaPlayer作为介绍,然后使用MediaPlayer#setOnEndOfMedia来调用循环AudioClip;可能在介绍和循环过渡之间有一个小的延迟,但在那之后是无缝的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java