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

Gstreamer 1.0-创建自定义消息/事件/信号,gstreamer,gstreamer-1.0,Gstreamer,Gstreamer 1.0,我正在用C为gstreamer 1.0编写一个自定义插件。 这个插件对帧执行一些处理,只要满足某些条件,就会向应用程序发送事件。 它不应该阻塞管道,也不应该干扰管道,只是一个信号,这样应用程序就可以触发一个与管道无关的操作 处理工作正常,但。。。我不知道下一步该怎么办。 有很多已经存在的消息,比如EOS或seek,但是我如何创建自己的消息呢? 消息应该包含自定义数据,因此我必须自己创建一个可以发送的数据 通过发送事件或信号,我找不到任何关于如何从插件处理自定义事件的示例/文档/解释 我甚至连一个

我正在用C为gstreamer 1.0编写一个自定义插件。
这个插件对帧执行一些处理,只要满足某些条件,就会向应用程序发送事件。 它不应该阻塞管道,也不应该干扰管道,只是一个信号,这样应用程序就可以触发一个与管道无关的操作

处理工作正常,但。。。我不知道下一步该怎么办。 有很多已经存在的消息,比如EOS或seek,但是我如何创建自己的消息呢? 消息应该包含自定义数据,因此我必须自己创建一个可以发送的数据

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

我甚至连一个示例代码都没有


如果您有任何见解,我们将不胜感激。

请查看
fpsdisplaysink
元素:

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

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信号文件:

# 或者,您可以创建自己的
GstMessage
并将其发布到总线上。请参阅GstMessage文档:


然后,您可以将数据包装到
gst结构中
。然后用
gst\u-bus\u-post()

将信息发布到公交车上,感谢Florian对我的帮助。
我最终使用了gst_消息_new和gst_post_总线

对于那些可能感兴趣的人来说,这里是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)

非常感谢你的回答。我用自己的gst结构和gst_总线_帖子创建了自己的gst消息。它可以工作,但我不知道如何在每次被触发时从应用程序本身获取回调。gst_bus_add_watch是否正确?我还研究了gst_bus_pop_筛选,但它应该是我事件的某种运行循环,并在接收错误或EOS事件时停止程序。是否有运行循环捕获应用程序事件的示例?我的主要应用程序是python,我发现,但我真的不知道如何用python翻译它。1) 您有一个运行的GMainLoop,您可以通过gst_bus_add_watch()添加一个总线手表。2) 您可以通过gst_bus_poll()定期轮询应用程序中的总线。3) 您可以通过gst_总线_set_sync_handler()设置同步处理程序。无论您采用何种方式,您都应该拥有它,因为管道运行时的所有错误/eos/etc报告都会在那里结束。对不起,我不会说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)