You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GStreamer:在C++中获取autovideosink解析后的视频Sink以设置属性

问题描述

我在C++代码中通过字符串形式的管道描述,使用gst_parse_launch(...)构建GStreamer管道,目前运行正常。现在我需要为管道中的autovideosink元素设置enable-last-sample属性,但该属性并不存在于autovideosink上。请问如何确定autovideosink实际解析出的视频Sink,以便设置该属性?

解决方法

autovideosink是一个自动选择实际视频Sink的bin容器,本身没有enable-last-sample这类属性,必须找到它内部实际加载的子元素才能设置。下面是几种可行的实现方式:

方法一:遍历autovideosink的子元素

  1. 在管道字符串中给autovideosink指定名称(比如... autovideosink name=my_sink ...),然后用gst_bin_get_by_name()从管道中获取该元素。
  2. 将元素强制转换为GstBin类型,通过gst_bin_iterate_elements()遍历所有子元素。
  3. 对每个子元素,检查其是否包含enable-last-sample属性,找到目标元素后用g_object_set()完成属性设置。

示例代码片段:

GstElement *pipeline = gst_parse_launch("... autovideosink name=my_sink ...", NULL);
GstElement *auto_sink = gst_bin_get_by_name(GST_BIN(pipeline), "my_sink");

GstIterator *it = gst_bin_iterate_elements(GST_BIN(auto_sink));
gpointer elem;
GstIteratorResult res;
while ((res = gst_iterator_next(it, &elem)) == GST_ITERATOR_OK) {
    GstElement *sink = GST_ELEMENT(elem);
    // 检查当前元素是否支持目标属性
    if (g_object_class_find_property(G_OBJECT_GET_CLASS(sink), "enable-last-sample")) {
        g_object_set(sink, "enable-last-sample", FALSE, NULL); // 根据需求设置布尔值
    }
    gst_object_unref(sink);
}
gst_iterator_free(it);
gst_object_unref(auto_sink);

方法二:监听autovideosink的element-added信号

autovideosink在确定实际使用的Sink元素后,会触发element-added信号。可以提前连接该信号,在回调中直接完成属性设置:

  1. 获取autovideosink元素后,用g_signal_connect()绑定element-added信号与回调函数。
  2. 在回调函数中,对新增的子元素进行属性检查并设置。

示例代码片段:

static void on_element_added(GstBin *bin, GstElement *elem, gpointer user_data) {
    if (g_object_class_find_property(G_OBJECT_GET_CLASS(elem), "enable-last-sample")) {
        g_object_set(elem, "enable-last-sample", FALSE, NULL);
    }
}

// 管道初始化阶段的代码
GstElement *pipeline = gst_parse_launch("... autovideosink name=my_sink ...", NULL);
GstElement *auto_sink = gst_bin_get_by_name(GST_BIN(pipeline), "my_sink");
g_signal_connect(auto_sink, "element-added", G_CALLBACK(on_element_added), NULL);
gst_object_unref(auto_sink);

方法三:直接指定具体视频Sink(替代autovideosink)

如果不需要适配不同环境的自动选择逻辑,也可以直接在管道字符串中使用具体的视频Sink元素(比如xvimagesink、ximagesink、glimagesink等),这样可以直接在管道字符串中设置属性,或通过元素名获取后设置:

... xvimagesink name=my_sink enable-last-sample=false ...

之后直接用gst_bin_get_by_name()获取my_sink元素即可,无需额外遍历操作。

内容的提问来源于stack exchange,提问作者Cole

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 12:35:23