首页 > 解决方案 > 使用 gst-rtsp-server Python 绑定处理错误

问题描述

我有一个简单的 Python 程序使用 gst-rtsp-server 创建一个 RTSP 流。它可以工作,但是没有错误处理。如果管道有错字或连接到视频源时出现问题,我看不到堆栈跟踪或任何日志记录。我会在哪里挂钩代码来处理这样的问题?

我应该提一下,我是 GObject 世界的初学者。我怀疑这些库有一种标准的方法来报告错误,但我无法在我读过的文档中找到有关如何完成的任何内容。

如果它有帮助,这是我现在拥有的代码:

from threading import Thread
from time import sleep
import signal

import gi
gi.require_version("Gst", "1.0")
gi.require_version("GstRtsp", "1.0")
gi.require_version("GstRtspServer", "1.0")
from gi.repository import GLib, GObject, Gst, GstRtsp, GstRtspServer

PIPELINE = (
    "( videotestsrc ! vp8enc ! rtpvp8pay name=pay0 pt=96 )")


def main():
    GObject.threads_init()
    Gst.init(None)

    server = GstRtspServer.RTSPServer.new()
    server.props.service = "3000"

    server.attach(None)

    loop = GLib.MainLoop.new(None, False)

    def on_sigint(_sig, _frame):
        print("Got a SIGINT, closing...")
        loop.quit()
    signal.signal(signal.SIGINT, on_sigint)

    def run_main_loop():
        loop.run()

    main_loop_thread = Thread(target=run_main_loop)

    main_loop_thread.start()

    media_factory = GstRtspServer.RTSPMediaFactory.new()
    media_factory.set_launch(PIPELINE)
    media_factory.set_shared(True)
    server.get_mount_points().add_factory("/test", media_factory)
    print("Stream ready at rtsp://127.0.0.1:3000/test")


    while loop.is_running():
        sleep(0.1)


if __name__ == "__main__":
    main()

标签: pythongstreamerrtsppygobjectpython-gstreamer

解决方案


do_handle_message因此,您可以通过Gst.Bin以下方式覆盖:

import gi
gi.require_version("Gst", "1.0")
from gi.repository import Gst, GLib
Gst.init(None)

class SubclassBin(Gst.Bin):
    def do_handle_message(self, message):
        if message.type == Gst.MessageType.ERROR:
            error, message = message.parse_error()
            # TODO: Do something with the error
        # Call the base Gst.Bin do_handle_message
        super().do_handle_message(self, message)

subclass_bin = SubclassBin("mybin")

也就是说,我不确定如何告诉GstRtspServer.RTSPMediaFactory使用SubclassBin而不是Gst.Bin因为据我所知,将任何 Bin 连接到的唯一方法RTSPMediaFactory是通过set_launch需要管道字符串而不是预建 bin 的方法。如果有一种方法可以将预建的 bin 添加到RTSPMediaFactory,这将是一个完整的答案……但不幸的是,这是我所能得到的。


推荐阅读