[英]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.