簡體   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