我是GStreamer的新手,我创建了一个小示例,其中记录了摄像头并使用appsink获取示例,但是当我尝试通过将其状态设置为null并发送EOS事件来停止管道时,我的总线回调功能永远不会被EOS调用。
伙计们,请帮助我
类主要: shutdown = False
def __init__(self):
signal.signal(signal.SIGINT, self.keyboardInterruptHandler)
self._pipeline = Gst.parse_launch("avfvideosrc name=avfvideosrc ! x264enc name=x264enc ! appsink name=appsink max-buffers=1 drop=false sync=false emit-signals=true wait-on-eos=false")
bus = self._pipeline.get_bus()
bus.add_signal_watch()
bus.connect("message::eos", self._on_eos_from_sink_pipeline)
bus.connect("message", self.on_status_changed)
appsink = self._pipeline.get_by_name('appsink')
appsink.connect('new-sample', self.on_new_sample)
appsink.connect('eos', self.eos)
#bus.connect('message', self.on_status_changed)
self._pipeline.set_state(Gst.State.PLAYING)
def on_new_sample(self, appsink):
return Gst.FlowReturn.OK
def _on_eos_from_sink_pipeline(self, _bus, _message):
print("Got EOS from sink pipeline")
exit()
def eos(self, sink):
print("SINK EOS")
return True
def on_status_changed(self, bus, message):
print('Status: ', message.type)
print('Object: ', message.src)
print('Parsed Message: ', message.parse_state_changed())
def keyboardInterruptHandler(self,signal, frame):
print("KeyboardInterrupt (ID: {}) has been caught. Cleaning up...".format(signal))
self.shutdown = True
self.stopFetching()
def stopFetching(self):
print("AT THE START OF STOP FETCHING")
self._pipeline.set_state(Gst.State.NULL)
self._pipeline.send_event(Gst.Event.new_eos())
print("AT THE END OF STOP FETCHING")
开始= Main() Gtk.main()
答案 0 :(得分:1)
您需要发送EOS并等待其到达您的处理程序。一旦发生这种情况,您可以将管道设置为NULL以完全关闭管道。
在当前代码中,将其设置为NULL然后发送事件时,管道已经关闭(设置为NULL会同步发生),并且该事件将不会发送。