VLCJ-4: воспроизведение звука останавливается слишком рано (событие "завершено" запускается до окончания медиа)

После переноса моего Java-приложения с vlcj-3.12.1 на vlcj-4.8.2 я наблюдаю, что событие finished() запускается примерно за 2 секунды до того, как носитель достигает конца/полной длины/длительности. Это портит мой графический интерфейс, так как у меня есть отображение времени мультимедиа, показывающее как прошедшее, так и оставшееся время. Поэтому, когда он показывает, что осталось 2 секунды, он внезапно прыгает до 0, и это звучит так, как будто последний бит звука «отрезается».

Пробовал разные медиафайлы и разные аудиоформаты с разным битрейтом (включая VBR) - результат во всех случаях одинаков. Следующий фрагмент файла журнала показывает, что длина носителя считывается правильно при получении события playing() (24 секунды). Я регистрирую события timeChanged() во время воспроизведения. Вы можете видеть, что эти события перестают поступать прямо перед тем, как время мультимедиа достигает ~ 22 секунд. Затем запускается событие finished(). После этого больше нет timeChanged() событий - последние 2 секунды воспроизведения отсутствуют.

Это ошибка в VLC или VLCJ, предназначенная для следующей версии, или я могу делать что-то не так? Проблема не возникает с vlcj-3.12.1, а также не возникает при воспроизведении мультимедиа с собственным VLC. Я действительно не хочу снова понижать рейтинг, но это своего рода разочарование. Я использую последнюю VLC версию 3.0.17.4 на Windows 10 с Java 17.0.5.

Заранее спасибо!

Я не использую свой собственный таймер, я делаю это именно так, как вы описали. Я прослушиваю события vlcj с изменением времени, и всякий раз, когда они происходят, я вызываю метод getMediaTime() в медиаплеере vlcj. Возвращаемое время мультимедиа затем передается на дисплей времени.

Bate 20.11.2022 18:06

Вы правы, но, как вы сказали, это не проблема. vlcj дает мне длину носителя. Прошедшее время — это время, которое приходит с событием изменения времени, оставшееся время — это длина мультимедиа минус текущее время мультимедиа. Журнал показывает, что vlcj сообщает мне, что продолжительность мультимедиа составляет 24 секунды, но отправляет готовое событие через 22 секунды. Что вызывает проблему. Должно быть легко воспроизвести

Bate 20.11.2022 22:13

Я также заметил, что VLC теперь отправляет событие остановки после завершения (чего раньше не было), но событие остановки запускается всего через несколько миллисекунд после завершения события. Так что это тоже не то, куда ушли 2 секунды...

Bate 20.11.2022 22:15

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

Bate 20.11.2022 22:54

Это интересно. Я всегда игнорировал эти события, так как не понимал, для чего они нужны. Я зарегистрировал их сейчас, но это не имеет значения: Исходная длина после события воспроизведения: 24171. Длина после первого события изменения длины: 24172. Длина после последнего события изменения длины: 24171. Время медиа в последний раз -changed event: 22112. Затем запускается готовое событие. Я действительно не понимаю, что там происходит. Я скачал ваш образец приложения vlcj и не вижу в нем проблемы, проигрывая тот же файл. До сих пор я не мог понять основные различия в наших кодах

Bate 23.11.2022 21:54

Я нашел проблему. Это связано со следующими параметрами VLC, которые я передал в MediaPlayerFactory: [--file-caching=2000 --network-caching=2000]. Именно на эти 2 секунды игрок останавливается раньше. Я использовал эти настройки в течение многих лет, и в предыдущих версиях VLC это никогда не было проблемой. Я всегда думал, что кэширование предотвратит возможное «заикание» плеера при воспроизведении больших файлов (аудио или видео) с сетевого диска, но, очевидно, теперь у него есть некоторые странные побочные эффекты. Возможно, это ошибка. Я удалил кеширование на данный момент, и все вернулось в норму.

Bate 25.11.2022 11:55

Интересно, никогда не знал, что это так работает. Вы можете написать свой собственный ответ и принять его, вы никогда не знаете, что это может помочь кому-то в будущем.

caprica 25.11.2022 17:17
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Как включить TLS в gRPC-клиенте и сервере : 2
Как включить TLS в gRPC-клиенте и сервере : 2
Здравствуйте! 🙏🏻 Надеюсь, у вас все хорошо и добро пожаловать в мой блог.
Сортировка hashmap по значениям
Сортировка hashmap по значениям
На Leetcode я решал задачу с хэшмапой и подумал, что мне нужно отсортировать хэшмапу по значениям.
Принципы SOLID - лучшие практики
Принципы SOLID - лучшие практики
SOLID - это аббревиатура, обозначающая пять ключевых принципов проектирования: принцип единой ответственности, принцип "открыто-закрыто", принцип...
gRPC на Android с использованием TLS
gRPC на Android с использованием TLS
gRPC - это относительно новая концепция взаимодействия между клиентом и сервером, но не более.
1
7
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел решение. Проблема была связана со следующими параметрами VLC, которые я передал в MediaPlayerFactory:

--file-caching=2000
--network-caching=2000

Именно эти 2 секунды пропускает медиаплеер при воспроизведении в конце файла. Не уверен, как это связано, может быть, это ошибка. Эти настройки не вызывали проблем в предыдущих версиях VLC. Я удалил кеширование на данный момент, и все вернулось в норму.

Другие вопросы по теме