我正在使用GStreamer-python创建以下管道:
v4l2src -> queue -> h264parse -> avdec_h264 -> glimagesink
根据我的用例,我想为收到的某个事件E1
暂停视频,然后针对事件E2
再次恢复播放。为了模拟这一点,我尝试使用valve
具有属性drop=true
的元素一定的超时时间。并设置drop=false
,在超时时间到期后恢复播放视频。
v4l2src -> queue -> h264parse -> avdec_h264 -> glimagesink
现在,执行此操作可以暂停视频,但无法恢复播放视频。
有一些链接,例如this和this,它们说明了如何暂停和恢复,但它讨论的是元素filesink
。
这是我的代码:
class ThreadingExample(object):
def __init__(self):
thread2 = threading.Thread(target=self.get)
self.valve = Gst.ElementFactory.make("valve","valve")
self.sink = Gst.ElementFactory.make("glimagesink", "sink")
thread2.start()
def get(self):
try:
cnt = 0
cnt2 = 0
while True:
cnt = cnt + 1
if cnt == 100000 and cnt2 == 0:
cnt = 0
cnt2 = 1
self.valve.set_property("drop","true")
#self.sink.set_property("async","false")
else:
if cnt2==1 and cnt == 100000:
self.valve.set_property("drop","false")
#self.sink.set_property("async","true")
cnt2 = 0
其他元素在class ThreadingExample
外部创建,并且相应地将元素添加到管道中。从代码中可以看出,我尝试使用drop
的{{1}}属性和valve
的{{1}}属性。但是它们都不起作用。
有人知道在GStreamer中暂停和恢复直播视频的正确方法是什么。
编辑:
1.我不想暂停整个流水线,而只是暂停来自async
的视频数据。这是因为我的用例要求我在暂停的视频上应用一些glimagesink
。这意味着接收器仍在流上最后应用了gltransformation的接收帧,直到接收到事件v4l2src
。