0

我正在尝试播放视频并有一个按钮可以将视频切换到新视频,在除开头之外的某个时间点开始新视频。我没有写太多 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 窗口中从视频切换到视频,从视频中的任意点开始?

4

1 回答 1

1

不要等待一秒钟,而是使用类似self.player.get_state(timeout=3*gst.SECOND)等待切换gst.STATE_PAUSED完成的方法。

使用超时是因为如果发生错误并且 GStreamer 无法成功更改管道状态,get_state则没有超时的 a 将永远陷入等待。

于 2010-11-28T10:48:13.003 回答