GStreamer - 向元素发出信号

Ivá*_*rez 1 c signals udp video-streaming gstreamer

我有一个写入 C 程序的管道,该程序将视频流从 stdin 重定向到多个 UDP 客户端。我希望动态添加或删除这些客户端,因此无法在编译时定义它们中的哪些以及将有多少。这是我的管道(如果我添加一个固定clients参数它工作正常):

fdsrc name=origin \
! video/x-h264,width=320,height=240,framerate=30/1,profile=baseline,stream-format=avc,alignment=au \
! h264parse \
! rtph264pay \
    config-interval=1 \
    pt=96 \
! multiudpsink name=dest \
     sync=false
Run Code Online (Sandbox Code Playgroud)

根据 GStreamer 文档,我可以通过发送信号来动态添加或删除客户端来实现它。在这种情况下,它应该是add信号

但是我找不到有关向元素(在本例中,是multiudpsink元素)发送信号的任何信息。很容易获得对我的元素的引用:

GstElement *sink = gst_bin_get_by_name(GST_BIN(pipeline), "dest");
/* TODO: send a signal to add a client */
g_object_unref(sink);
Run Code Online (Sandbox Code Playgroud)

但是现在我怎样才能向那个元素发出信号呢?

Ivá*_*rez 6

最后我明白了。使用g_signal_emit_by_name您可以向任何 GStreamer 元素发送消息。

代码如下:

GstElement *sink = gst_bin_get_by_name(GST_BIN(pipeline), "dest");
g_signal_emit_by_name(sink, "add", "192.168.1.25", 5004, NULL);
g_object_unref(sink);
Run Code Online (Sandbox Code Playgroud)

感谢来自 GStreamer-devel 邮件列表的 Tim Müller,他为我提供了有关如何进行的正确示例