Переключить GST видео в какой-то момент в другом видео по нажатию кнопки Pygtk - PullRequest
0 голосов
/ 16 ноября 2010

Я пытаюсь воспроизвести видео и у меня есть кнопка, которая переключает видео на новое, запускает новое в какой-то момент, отличный от начала .Я не написал много UI или кода, связанного с видео.

У меня есть следующие работы (очень обрезанные):

class Main(gobject.GObject):
  def __init__(self):
    self.player = gst.element_factory_make('playbin', 'VideoPlayer')
    #.. pygtk UI/Button code

  def next_video(self):
    self.player.set_state(gst.STATE_NULL)
    self.player.set_property('uri', 'next_video_path')
    self.player.set_state(gst.STATE_PAUSED)
    end = time.time() + 1
    while time.time() < end:
      pass
    self.player.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, 100000000000)
    self.player.set_state(gst.STATE_PLAYING)

if __name__ == "__main__":
  Main(sys.argv)
  gtk.main()

Пара баллов:

  • Я использую GObject, потому что я хотел иметь возможность использовать gobject.timeout_add, поскольку мне нужно, чтобы что-то происходило периодически.Я не женат на этом, если есть другой способ.
  • Без этого 1 секундного ожидания это не сработает.Использование time.sleep () вызывает ошибку сегмента.
  • Иногда я вижу всплывающее окно с началом видео, а иногда оно просто начинается с начала.
  • Было высказано предположение, что яиметь фоновый playbin и «горячей замены» их.Это было бы хорошо - я просто не уверен, как это сделать.

Очевидно, я бы хотел более чистый и надежный способ сделать это.

TL; DR: как я могу переключиться с видео на видео в окне pygtk, начиная с произвольной точки в видео?

1 Ответ

1 голос
/ 28 ноября 2010

Вместо того, чтобы ждать одну секунду, используйте что-то вроде self.player.get_state(timeout=3*gst.SECOND), чтобы дождаться завершения переключения на gst.STATE_PAUSED.

Время ожидания используется, потому что если возникает ошибка и GStreamer не удается изменить состояние конвейера, get_state без таймаута просто застрянет в ожидании навсегда.

...