GstBus没有收到EOS事件

时间:2019-10-22 11:19:08

标签: python gstreamer

我是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()

1 个答案:

答案 0 :(得分:1)

您需要发送EOS并等待其到达您的处理程序。一旦发生这种情况,您可以将管道设置为NULL以完全关闭管道。

在当前代码中,将其设置为NULL然后发送事件时,管道已经关闭(设置为NULL会同步发生),并且该事件将不会发送。