После переноса моего 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 дает мне длину носителя. Прошедшее время — это время, которое приходит с событием изменения времени, оставшееся время — это длина мультимедиа минус текущее время мультимедиа. Журнал показывает, что vlcj сообщает мне, что продолжительность мультимедиа составляет 24 секунды, но отправляет готовое событие через 22 секунды. Что вызывает проблему. Должно быть легко воспроизвести
Я также заметил, что VLC теперь отправляет событие остановки после завершения (чего раньше не было), но событие остановки запускается всего через несколько миллисекунд после завершения события. Так что это тоже не то, куда ушли 2 секунды...
Извлечь код и разместить его здесь сложно, так как он распределен по нескольким классам и довольно сложен. Я попробую, что смогу, но это займет время...
Это интересно. Я всегда игнорировал эти события, так как не понимал, для чего они нужны. Я зарегистрировал их сейчас, но это не имеет значения: Исходная длина после события воспроизведения: 24171. Длина после первого события изменения длины: 24172. Длина после последнего события изменения длины: 24171. Время медиа в последний раз -changed event: 22112. Затем запускается готовое событие. Я действительно не понимаю, что там происходит. Я скачал ваш образец приложения vlcj и не вижу в нем проблемы, проигрывая тот же файл. До сих пор я не мог понять основные различия в наших кодах
Я нашел проблему. Это связано со следующими параметрами VLC, которые я передал в MediaPlayerFactory: [--file-caching=2000 --network-caching=2000]. Именно на эти 2 секунды игрок останавливается раньше. Я использовал эти настройки в течение многих лет, и в предыдущих версиях VLC это никогда не было проблемой. Я всегда думал, что кэширование предотвратит возможное «заикание» плеера при воспроизведении больших файлов (аудио или видео) с сетевого диска, но, очевидно, теперь у него есть некоторые странные побочные эффекты. Возможно, это ошибка. Я удалил кеширование на данный момент, и все вернулось в норму.
Интересно, никогда не знал, что это так работает. Вы можете написать свой собственный ответ и принять его, вы никогда не знаете, что это может помочь кому-то в будущем.
Я нашел решение. Проблема была связана со следующими параметрами VLC, которые я передал в MediaPlayerFactory:
--file-caching=2000
--network-caching=2000
Именно эти 2 секунды пропускает медиаплеер при воспроизведении в конце файла. Не уверен, как это связано, может быть, это ошибка. Эти настройки не вызывали проблем в предыдущих версиях VLC. Я удалил кеширование на данный момент, и все вернулось в норму.
Я не использую свой собственный таймер, я делаю это именно так, как вы описали. Я прослушиваю события vlcj с изменением времени, и всякий раз, когда они происходят, я вызываю метод getMediaTime() в медиаплеере vlcj. Возвращаемое время мультимедиа затем передается на дисплей времени.