簡體   English   中英

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

總線消息處理程序 function:

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

最后是信號處理程序 function:

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()將接管所有總線消息並丟棄所有消息或返回有問題的 EOS。 由於您沒有說它最后會死鎖/永遠等待,我假設timed_pop_filtered()正確返回了 EOS。 由於timed_pop_filtered()將帶走所有消息,因此您的總線手表此時不會再收到任何消息。

因此,與其使用timed_pop_filtered()獲取所有消息,不如等待來自總線手表的信號,只要 EOS 到達那里就會觸發該信號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM