Я в настоящее время нахожусь в проекте Java, который использует интерфейс удаленного управления сокетом vlc для воспроизведения аудиовизуального контента (например, vlc -I rc --rc-host=localhost:[portnumber]
). Интерфейс приводит к некоторым частным случаям, которые кажутся сложными для решения:
Согласно справке по дистанционному управлению vlc, команда паузы является функцией переключения, поэтому вы
должны следить за текущим состоянием игрока.
Команда add
запустит видео, только если текущее видео не приостановлено.
Команда is_playing
всегда выводит 1, когда она приостановлена или нет, и
status
Команда не говорит, приостановлена она или нет.
Ограничение клиента заключается в том, что видео нужно ставить на последний кадр. К счастью, есть параметр для решения этой проблемы: --play-and-pause
.
Проблема заключается в следующем. Если vlc доходит до последнего кадра и останавливает видео самостоятельно, как я могу узнать об этом? На данный момент я использую get_time
в надежде просто считать видео приостановленным, если обратный отсчет равен 0. Однако, оказывается, что vlc приостанавливает само видео в 0:01, заставляя меня также выдать 0:01 в качестве финала значение. Это приводит к сбою, когда пользователь запускает другое видео, в то время как перед последним кадром действительно остается одна секунда, поскольку проверка 0:01 считает его приостановленным, а это не так. Вот краткое изложение того, что происходит:
0: 20 (без паузы) + кнопка воспроизведения:
send ("add [filepath]");
Fine
0: 00 (пауза) + кнопка воспроизведения:
отправить ( "пауза");
send ("add [filepath]");
Fine
0: 01 (пауза) + кнопка воспроизведения:
отправить ( "пауза");
send ("add [filepath]");
Fine
0: 01 (без паузы) + кнопка воспроизведения:
отправить ( "пауза");
send ("add [filepath]");
Неожиданное поведение: оно не будет играть, потому что оно приостановлено, и мы не знаем об этом
Существует ли безопасный подход к состоянию игрока, чтобы не было неопределенного поведения? Я заметил, что консоль удаленного управления иногда выводит что-то, когда vlc делает паузу самостоятельно. Однако это кажется небезопасным, поскольку может выводить некоторые события, которые срабатывают до или после этого события.
Спасибо.