Gstreamer 1.0 - 创建自定义消息/事件/信号

问题描述 投票:0回答:2

我正在为C中的gstreamer 1.0编写一个自定义插件。 此插件对帧执行一些处理,并且只要满足某些条件,就应该向应用程序发送事件。它不应该阻止管道不干扰它,只是一个信号,所以应用程序可以触发与侧面管道无关的动作。

处理工作正常,但......我不知道接下来该做什么。有许多已经存在的消息,如EOS或寻求,但我如何创建自己的消息?该消息应包含自定义数据,因此我必须自己创建一个我可以发送的数据。

通过发送事件或信号,我无法找到关于如何从插件处理自定义事件的任何示例/文档/解释。

我甚至没有开始的示例代码。

任何见解将不胜感激。

gstreamer gstreamer-1.0
2个回答
1
投票

看看fpsdisplaysink元素:

https://github.com/GStreamer/gst-plugins-bad/blob/master/gst/debugutils/fpsdisplaysink.c

这个发出应用程序可以连接的信号。最有趣的可能是信号创建:

g_signal_new ("fps-measurements", G_TYPE_FROM_CLASS (klass),
      G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL,
      G_TYPE_NONE, 3, G_TYPE_DOUBLE, G_TYPE_DOUBLE, G_TYPE_DOUBLE);

并周期性地触发所述信号:

g_signal_emit (G_OBJECT (self),
        fpsdisplaysink_signals[SIGNAL_FPS_MEASUREMENTS], 0, rr, dr,
        average_fps);

有关详细信息,请参阅GLib信号文档:

https://developer.gnome.org/gobject/stable/gobject-Signals.html

#

或者,您可以创建自己的GstMessage并将其发布在公交车上。请参阅GstMessage文档:

https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstMessage.html

GstMessage *gst_message_new_application (GstObject *src,
    GstStructure *structure);

然后,您可以将数据包装在GstStructure中。然后用gst_bus_post()将消息发布到总线。


0
投票

感谢Florian的见解,这对我帮助很大。 我最终使用了gst_message_new和gst_post_bus。

对于那些可能感兴趣的人来说,我在python中实现了一个运行循环的代码。

def connect(bus, name):
    def _connect(f):
        bus.connect(name, f)
        return f
    return _connect

....
    bus = self.pipeline.get_bus()
    bus.add_signal_watch()

    ret = self.pipeline.set_state(Gst.State.PLAYING)
    if ret == Gst.StateChangeReturn.FAILURE:
        logger.error("ERROR: Unable to set the pipeline to the playing state")

    loop = GObject.MainLoop()

    print()

    @connect(bus, "message::"+Gst.MessageType.get_name(Gst.MessageType.ERROR))
    def on_error(bus, message):
        err, dbg = message.parse_error()
        print("ERROR:", message.src.get_name().encode('utf-8'), ":", err.message.encode('utf-8'))
        if dbg:
            print("debugging info:", dbg)

        loop.quit()

    @connect(bus, "message::"+Gst.MessageType.get_name(Gst.MessageType.EOS))
    def on_eos(bus, message):
        logger.info("End-Of-Stream reached")
        loop.quit()

    .... other events

    try:
        loop.run()
    except KeyboardInterrupt:
        pass

    print("START : Pipeline has stopped")
    self.pipeline.set_state(Gst.State.NULL)
© www.soinside.com 2019 - 2024. All rights reserved.