Gstreamer Python: 没有收到 EOS 消息?

Gstreamer Python: EOS message not received?

我有一个 Python Deepstream 应用程序(基于 Gstreamer),我希望它在按下 Ctrl+C 时正确结束。

我的管道包含以下元素:

source -> streammux -> tee -> nvinfer -> nvvideoconvert -> nvdosd -> filesink
                        |---> filesink

我的主要代码是:

self.loop = GObject.MainLoop.new(None, False)
GLib.unix_signal_add(-100, 2, self.handle_sigint, None)
self.bus = self.gst_pipeline.get_bus()
self.bus.add_signal_watch()
self.bus.connect("message", self.bus_message_handler)
self.gst_pipeline.set_state(Gst.State.PLAYING)
self.loop.run()

总线消息处理函数:

def bus_message_handler(self, bus, message: Gst.Message) -> bool:
    t = message.type
    logger.info(f"****************** Message received {t}")
    if t == Gst.MessageType.EOS:
        logger.success("End of Stream")
        self.loop.quit()
    elif t == Gst.MessageType.WARNING:
        err, debug = message.parse_warning()
        logger.warning(f"{err}: {debug}")
    elif t == Gst.MessageType.ERROR:
        err, debug = message.parse_error()
        logger.error(f"{err}: {debug}")
        self.gst_error = f"{err}: {debug}"
        self.loop.quit()
    return True

最后是 sigint 处理函数:

def handle_sigint(self, user_data=None):
    logger.info("SIGINT detected. Sending EOS...")
    self.gst_pipeline.send_event(Gst.Event.new_eos())
    self.bus.timed_pop_filtered(Gst.CLOCK_TIME_NONE, Gst.MessageType.EOS)

预期的行为是:

Run -> Ctrl+C pressed -> Print "SIGINT detected. Sending EOS..." -> Print "End of Stream"

但是“流结束”永远不会打印出来。为什么 bus_message_handler 没有收到 EOS 消息?

谢谢。

大胆猜测,我实际上并没有查看代码中的这个细节,但我假设 timed_pop_filtered() 将接管所有总线消息并丢弃所有消息或 return EOS有问题。因为你没有在最后说 deadlocks/waits 永远,所以我假设 timed_pop_filtered() return 正确地输入了 EOS。由于 timed_pop_filtered() 将带走所有消息,此时您的公交手表将不会再收到任何消息。

因此,与其用 timed_pop_filtered() 抓取所有消息,不如等待 EOS 到达时触发的来自公交车手表的信号。