Python 按pygtk按钮将gst视频切换到另一个视频中的某个点

Python 按pygtk按钮将gst视频切换到另一个视频中的某个点,python,video,pygtk,gstreamer,Python,Video,Pygtk,Gstreamer,我试着播放一个视频,有一个按钮可以将视频切换到一个新的视频,在开始之外的某个点开始新的视频。我没有写太多的UI或视频相关代码 我有以下这类作品(非常精致): class Main(gobject.gobject): 定义初始化(自): self.player=gst.element\u factory\u make('playbin','VideoPlayer')) #.. pygtk用户界面/按钮代码 def next_视频(自): self.player.set_state(gst.stat

我试着播放一个视频,有一个按钮可以将视频切换到一个新的视频,在开始之外的某个点开始新的视频。我没有写太多的UI或视频相关代码

我有以下这类作品(非常精致):

class Main(gobject.gobject):
定义初始化(自):
self.player=gst.element\u factory\u make('playbin','VideoPlayer'))
#.. pygtk用户界面/按钮代码
def next_视频(自):
self.player.set_state(gst.state_NULL)
self.player.set_属性('uri','next_video_path')
self.player.set_状态(gst.state_暂停)
结束=时间。时间()+1
while time.time()
有两点:

  • 我之所以使用GObject,是因为我希望能够使用GObject.timeout\u add,因为我需要定期发生一些事情。如果还有别的办法的话,我可不会嫁给它
  • 如果没有那1秒钟的等待,它就无法工作。使用time.sleep()会导致seg故障
  • 我有时确实看到视频开头的一点,有时只是从开头开始
  • 有人建议我有一个背景playbin和“热插拔”它们。这很好,我只是不知道怎么做
显然,我想要一个更干净、更可靠的方法来做这件事


TL;DR:如何在pygtk窗口中从视频中的任意点开始从一个视频切换到另一个视频?

不要等待一秒钟,而是使用类似于
self.player.get_state(timeout=3*gst.second)
的方法等待切换到
gst.state_暂停
完成


之所以使用超时,是因为如果发生错误并且GStreamer无法成功更改管道状态,那么没有超时的
get\u state
将永远等待。

首先,不要修剪代码。显示完整的代码或其链接。例如,您可能需要执行gobject.threads_init(),而您的代码并没有显示您正在这样做。接下来,转到暂停可能需要时间。您可以以阻塞的方式等待它(我相信带有wait_状态),或者为状态更改消息附加一个总线处理程序。在管道实际更改为暂停之前,不应执行查找。如果你这样做,时间黑客就不需要了,而且无论如何都是不正确的。我没有看到您在代码中使用gobject\u timeout\u add,所以不知道您为什么提到它。谢谢。这消除了抖动。
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()