Java Бесшовная Аудио Переход / Цикл - PullRequest
0 голосов
/ 28 января 2019

Как вы можете обеспечить плавный переход между двумя фрагментами звука?

В приложении JavaFX я использую javafx.scene.media.MediaPlayer для воспроизведения вступительного фрагмента, который выполняется main / looping-кусок.Медиа проигрывается просто отлично, но проблема в переходе и цикле.

Вот что я сейчас делаю:

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)

1 Ответ

0 голосов
/ 28 января 2019

Javadocs *1001* AudioClip заявляют, что AudioClip представляет сегмент аудио, который может быть воспроизведен с минимальной задержкой и может использоваться немедленно.Тем не менее, в нем также говорится, что

Медиа-объекты лучше подходят для долгоиграющих звуков.Это в первую очередь потому, что AudioClip хранит в памяти необработанные несжатые аудиоданные для всего звука, которые могут быть довольно большими для длинных аудиоклипов.MediaPlayer будет иметь достаточно предварительно распакованных аудиоданных, предварительно загруженных в память, для воспроизведения в течение короткого промежутка времени, поэтому он намного более эффективно использует память для длинных клипов, особенно если они сжаты.

В зависимости отдлина зацикленного носителя, AudioClip может быть лучше для вас.Вместо того, чтобы ScheduledExecutorService воспроизводить звук, вы можете использовать AudioClip.setCycleCount(AudioClip.INDEFINITE) для зацикливания навсегда.

Используя эту информацию, я считаю, что вам лучше всего использовать MediaPlayer для вступления, а затем использоватьMediaPlayer#setOnEndOfMedia для вызова цикла AudioClip;возможно, с небольшой задержкой между вступлением и циклическим переходом, но после этого без проблем.

...