python - Gstreamer Python:未收到 EOS 消息?
问题描述
我有一个 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"
但是“流结束”永远不会打印出来。为什么没有收到 EOS 消息bus_message_handler
?
谢谢。
解决方案
大胆猜测,我实际上并没有在代码中查看这个细节,但我认为timed_pop_filtered()
它将接管所有总线消息并丢弃所有消息或返回有问题的 EOS。由于您没有说它最终会死锁/永远等待,因此我假设timed_pop_filtered()
正确返回了 EOS。由于timed_pop_filtered()
将带走所有消息,因此此时您的巴士手表将不会再收到任何消息。
因此,与其抢走所有消息,不如timed_pop_filtered()
等待来自总线手表的信号,该信号在您的 EOS 到达那里时触发。
推荐阅读
- linq - Entity Framework Core + 使用 Group By 计数
- swift - 如何声明具有两种可能类型的变量
- python - 如何检查字符串中的日期是否大于给定日期?蟒蛇 3
- php - 如何在php中序列化反序列化mongo文档?
- python - Python SET 到 DICT 导致不可散列的类型:'set'
- rasa-nlu - 为 RASA NER_CRF 创建良好数据集的约定
- javascript - 为什么我不能从我的 onreadystatechange 处理程序中访问 xhr 对象?
- c - 奇怪的 UDP 吞吐现象
- regex - 正则表达式货币 Python 3.5
- javascript - VueJS:动态类绑定