在pygtk按钮按下时切换gst视频到另一视频的某个点
我想播放一个视频,并且有一个按钮可以切换到另一个视频,而且是从视频的某个特定位置开始播放,而不是从头开始。我写的关于用户界面和视频的代码不多。
我有以下代码,虽然不太完整,但能部分实现功能:
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
就会一直卡在那里,永远等下去。