跳转至

GStreamer 查询元素的 pad capabilities

为什么需要用到这个,在现实中会遇到gst_element_link失败,那么有可能元素的pad的能力是否匹配。换句话说,数据流元素是否支持这种格式,如果不支持那么很多情况下都是link失败;

1. 命令查询

gst-inspect-1.0 <GstElement>

在这里插入图片描述

2. 代码实现

比如在videobalance gamma 连接出现错误,则需要添加代码查询他们的pad能力;

关键点:

  • videoconvert 元素的作用是将视频格式从一种格式转换成另一种格式(例如,颜色空间转换)。因此,数据是从它的 sink pad 输入,经过转换后输出到 src pad
  • gamma 元素的作用是调整视频流的伽玛值,通常它需要接受已经是正确格式的视频流数据。

连接顺序:

  1. videoconvertsrc pad -> gammasink pad: 这是因为 videoconvert 经过格式转换后会把数据输出到它的 src pad,然后你需要把这个输出的数据传递给 gamma,让它处理(如调整伽玛)。
  2. gammasrc pad -> 下游接收器: 一旦 gamma 处理了数据,它会通过它的 src pad 输出视频数据到下游元素。
// 确保连接正确的 pad
ret = gst_element_link(videoconvert, gamma);
if (!ret) {
    GST_ERROR_OBJECT(vsb, "Failed to link videoconvert to gamma");
}

查看:

#include <gst/gst.h>

GstPad *src_pad_vc, *sink_pad_gamma;
GstCaps *caps_vc, *caps_gamma;

// 获取 videoconvert 的输出 pad(src)
src_pad_vc = gst_element_get_static_pad(videoconvert, "src");
if (!src_pad_vc) {
    GST_ERROR("Failed to get src pad from videoconvert");
    return;
}

// 获取 gamma 的输入 pad(sink)
sink_pad_gamma = gst_element_get_static_pad(gamma, "sink");
if (!sink_pad_gamma) {
    GST_ERROR("Failed to get sink pad from gamma");
    gst_object_unref(src_pad_vc);
    return;
}

// 查询 caps
caps_vc = gst_pad_query_caps(src_pad_vc, NULL);  // 不过滤,获取所有可能的格式
caps_gamma = gst_pad_query_caps(sink_pad_gamma, NULL);  // 不过滤,获取所有可能的格式

// 打印 capabilities 信息
GST_INFO("videoconvert src pad capabilities: %s", gst_caps_to_string(caps_vc));
GST_INFO("gamma sink pad capabilities: %s", gst_caps_to_string(caps_gamma));

// 确保 capabilities 能够兼容,如果需要的话可以对这些 caps 进行进一步处理
// 比如,如果发现不匹配,可以使用 gst_element_link_filtered 来强制链接

// 清理
gst_caps_unref(caps_vc);
gst_caps_unref(caps_gamma);
gst_object_unref(src_pad_vc);
gst_object_unref(sink_pad_gamma);

打印:

image-20241224170325986