Python VLC - получить скорость опроса позиции обходить - PullRequest
0 голосов
/ 25 сентября 2019

Я использую Python VLC для создания собственного приложения для воспроизведения в pyqt.Я нарисовал хороший пользовательский слайдер для отслеживания вместе с видео, но столкнулся с досадной проблемой.

Независимо от того, как часто я говорю своему слайдеру, чтобы обновить, он довольно глючный (прыжки каждые 1/4 секундыили около того) и выглядит прерывистым (только временная шкала, а не видео).

Копаясь в нем, я узнал, что

media_player.get_position()

имеет довольно низкую частоту опроса.Он возвращает одно и то же значение довольно часто, а затем скачет на большую величину в следующий раз, когда дает новое значение.

Итак, сейчас я запустил некоторые тестовые метрики и обнаружил, что они имеют тенденцию обновляться каждые 0,25-0,3 секунды.Итак, теперь у меня есть система, в которой basicay хранит последнее значение и последнее системное время, в которое было введено новое значение, и последнее расстояние перехода в возвращаемых значениях и выполняет некоторые базовые математические операции с этими вещами, чтобы имитировать правильные данные линейной временной шкалы между опросами, чтобы сделатьочень плавный слайдер временной шкалы.

Проблема в том, что это предполагает, что мои значения каждые 0,25–0,3 секунды одинаковы для машин, оборудования, частоты кадров видео и т. д.

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

Может быть, способ увеличить частоту опроса VLC, чтобы дать мне лучшие данные для начала - или какую-то лучшую математику для обработки сглаживания?

Спасибо

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

Использование get_position() возвращает значение от 0,0 до 1,0, по сути, процент от текущей позиции, измеренный по отношению к общему времени работы.
Вместо этого вы можете использовать get_time(), который возвращает текущую позицию в тысячных долях секунды.
то есть
print (self.player.get_time()/1000) будет печатать текущую позицию в секундах.

Вы также можете зарегистрировать обратный вызов для vlc event EventType.MediaPlayerTimeChanged, как упоминалось в другом ответе, заданном @mtz
т.е. где self.player определяется как:

    self.Instance = vlc.Instance()
    self.player = self.Instance.media_player_new()

Тогда:

    self.vlc_event_manager = self.player.event_manager()
    self.vlc_event_manager.event_attach(vlc.EventType.MediaPlayerTimeChanged, self.media_time_changed)

def media_time_changed(self,event):
    print (event.u.new_time/1000)
    print (self.player.get_time()/1000)
    print (self.player.get_position())
0 голосов
/ 26 сентября 2019

Попробуйте вместо этого использовать медиаплеер libvlc_MediaPlayerPositionChanged или libvlc_MediaPlayerTimeChanged.

https://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__event.html#gga284c010ecde8abca7d3f262392f62fc6a4b6dc42c4bc2b5a29474ade1025c951d

...