在pygtk按钮按下时切换gst视频到另一视频的某个点

0 投票
1 回答
581 浏览
提问于 2025-04-16 07:10

我想播放一个视频,并且有一个按钮可以切换到另一个视频,而且是从视频的某个特定位置开始播放,而不是从头开始。我写的关于用户界面和视频的代码不多。

我有以下代码,虽然不太完整,但能部分实现功能:

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()会导致程序崩溃。
  • 有时候我会看到视频开头的画面闪一下,有时候视频就直接从头开始播放。
  • 有人建议我使用一个后台的播放组件,然后进行“热切换”。这样也可以,但我不太确定怎么做。

显然,我希望能有一种更简洁、更可靠的方法来实现这个功能。

总结一下:我该如何在pygtk窗口中切换视频,并从视频的任意位置开始播放呢?

1 个回答

1

与其等一秒钟,不如用类似 self.player.get_state(timeout=3*gst.SECOND) 这样的代码,来等待状态切换到 gst.STATE_PAUSED 完成。

这里用到超时是因为,如果发生错误,GStreamer 没法成功改变管道的状态,那么如果不设置超时的 get_state 就会一直卡在那里,永远等下去。

撰写回答