Заикание в java vlcj при воспроизведении расширяющихся файлов wav

Я использую vlcj в java для воспроизведения файлов wav, которые расширяются другими службами. Моя проблема заключается в следующем:

когда я открываю аудиофайл, плеер знает, что продолжительность составляет x секунд. Если он достигает конца, он должен повторно открыть (player.controls().start()) файл, чтобы узнать расширенную продолжительность. Этот перезапуск вызывает микрозаикание при воспроизведении (например, 0,1 секунды), но его можно услышать, и если процесс расширения идет медленно, заикание может происходить каждые 2 секунды.

У меня нет возможности изменить базовую архитектуру, поэтому я не могу использовать потоковую передачу.

Основная проблема, которую я вижу после нескольких часов исследований, заключается в том, что vlcj не предоставляет способа вручную обновить продолжительность (которую я могу рассчитать по размеру файла) воспроизводимого аудиофайла (вероятно, он загружает его в память при открытии, я думаю) .

Кто-нибудь пытался успешно реализовать такое воспроизведение?


person danielbene    schedule 04.08.2020    source источник
comment
@caprica Да, именно! Серверная часть генерирует эти wav-файлы динамически, и у меня есть только путь к их хранилищу. Когда создается новый файл, я начинаю воспроизводить его с минимальной задержкой во внешнем интерфейсе. Файлы по-прежнему записываются при воспроизведении. Я ищу способ обновить файл (или просто свойство длины, если это возможно) без его перезагрузки.   -  person danielbene    schedule 05.08.2020
comment
@caprica Это похоже на аудиозапись в wav, поэтому файлы постоянно записываются до конечной точки (это альтернатива потоковой передаче, потому что другие требования к серверной части - это странно, я знаю). Проблема выглядит следующим образом: когда я загружаю файл, libvlc сканирует продолжительность, например, 15 секунд в тот момент. Воспроизведение начинается, а по достижении 15 сек останавливается, тем не менее файл записался на 30 сек за это время. Я должен перезагрузить его и начать с 15-й секунды, чтобы продолжить.   -  person danielbene    schedule 05.08.2020
comment
@caprica Клиенты работают в Windows и основаны на Java 9. Контейнеры Wav не указывают продолжительность в заголовке файла, поэтому мы можем использовать (расширять) их таким образом. Если я отслеживаю обнаруженную продолжительность через вызов InfoApi, она не показывает изменений, остается неизменной от загрузки до конца. Ничего страшного, если у вас нет решения, это действительно конкретный вариант использования. Спасибо за ваше время.   -  person danielbene    schedule 05.08.2020


Ответы (1)


После продолжительного исследования темы я пришел к выводу, что воспроизведение без заиканий с описанной выше настройкой невозможно. Его можно значительно оптимизировать, но он никогда не будет идеальным. Корень проблемы в том, что длину (длительность) воспроизводимого wav-файла нельзя установить вручную, поэтому для повторного сканирования необходима перезагрузка.

Мое решение для этого состояло в том, чтобы реализовать сервер потоковой передачи live555 RTSP между хранилищем и клиентом. Проигрыватель vlcj подключается к потоку rtsp и плавно воспроизводит (расширяющийся) файл. Недостатки заключаются в том, что игровое время требует специальной обработки и имеет меньшую производительность (медленная реакция на события).

person danielbene    schedule 07.08.2020