gpt4 book ai didi

Java 无缝音频转换/循环

转载 作者:行者123 更新时间:2023-12-03 01:34:36 24 4
gpt4 key购买 nike

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

在 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 playing background music loop with small intro music

This one is definitely relevant (coincidentally, it is almost the anniversary of that post), but I am already using a .wav formatted media file and still experience a delay.

JavaFX AudioClip.play()

Which is similar to what I tried with the Audioclip, exept I used a scheduled executor to time when to replay the audio. (Where I still experienced a delay).



最后,我在 Audacity 中测试了我的音频,它们可以无缝地转换和循环播放。

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

编辑:
  • 在代码块中添加了一个附录,提到 MediaPlayer::setCycleCount(Integer)
  • 最佳答案

    AudioClip Javadocs声明 AudioClip 表示可以以最小延迟播放并且可以立即使用的一段音频。但是,它也指出

    Media objects are however better suited for long-playing sounds. This is primarily because AudioClip stores in memory the raw, uncompressed audio data for the entire sound, which can be quite large for long audio clips. A MediaPlayer will only have enough decompressed audio data pre-rolled in memory to play for a short amount of time so it is much more memory efficient for long clips, especially if they are compressed.



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

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

    关于Java 无缝音频转换/循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54392869/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com