我是GStreamer新手,我已经创建了一个小示例,其中我正在录制网络摄像头,并使用appsink获取样本,但当我试图通过将其状态设置为null并发送EOS事件来停止管道时,我的总线回调函数从未为EOS调用过。
伙计们,请帮帮我
class Main: 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")start = Main() Gtk.main()
发布于 2019-10-23 06:48:41
您需要发送EOS并等待它到达您的处理程序。一旦发生这种情况,您可以将管道设置为NULL以完全关闭管道。
在您当前的代码中,当您将其设置为NULL,然后发送一个事件时,管道已经关闭(设置为NULL会同步发生),事件将不会被发送。
https://stackoverflow.com/questions/58503100
复制相似问题