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

如何创建名称含括号的GStreamer Caps?解决代码运行报错

解决GStreamer创建video/x-raw(memory:GBM) Caps时的结构名无效错误

问题场景

我的GStreamer源元素具备以下能力:

Capabilities:              
  image/jpeg               
              width: [ 16, 5184 ]
             height: [ 16, 3880 ]
          framerate: [ 0/1, 120/1 ]
  video/x-raw
             format: { (string)NV12, (string)NV16 }
              width: [ 16, 5184 ]
             height: [ 16, 3880 ]
          framerate: [ 0/1, 120/1 ]
  video/x-raw(memory:GBM)
             format: { (string)NV12, (string)NV16 }
              width: [ 16, 5184 ]
             height: [ 16, 3880 ]
          framerate: [ 0/1, 120/1 ]
  video/x-bayer
             format: { (string)bggr, (string)rggb, (string)gbrg, (string)grb }
                bpp: { (string)8, (string)10, (string)12, (string)16 }      
              width: [ 16, 5184 ]                                           
             height: [ 16, 3880 ]                                           
          framerate: [ 0/1, 120/1 ]  

我想实现和以下命令行等价的代码逻辑:

[start of chain] ! capsfilter 'video/x-raw(memory:GBM),format=NV12,width=1280,height=720,framerate=30/1' ! [rest of chain...]

但调用以下代码时出现报错:

GstCaps *caps = gst_caps_new_simple ("video/x-raw(memory:GBM)",
 "format", G_TYPE_STRING, "NV12",
 "framerate", GST_TYPE_FRACTION, 30, 1,
 "width", G_TYPE_INT, 1280,
 "height", G_TYPE_INT, 720,
 NULL);

报错信息:

structure gststructure.c:333:gst_structure_validate_name: Invalid character '(' at offset 11 in structure name: video/x-raw(memory:GBM)

原因分析

gst_caps_new_simple()的第一个参数是结构名称,GStreamer对结构名称有严格的字符限制,不允许包含(、)这类符号。而命令行中的video/x-raw(memory:GBM)是GStreamer提供的快捷语法,并非原始的结构名称——括号里的memory:GBM是该Caps的内存属性,不是结构名的一部分。

解决方法

有两种可靠的解决方式:

方法一:使用gst_caps_from_string()直接解析命令行格式字符串

这种方式最直观,和命令行写法完全一致,函数会自动处理括号语法,无需手动拆分属性:

GstCaps *caps = gst_caps_from_string("video/x-raw(memory:GBM),format=NV12,width=1280,height=720,framerate=30/1");

方法二:分步创建Caps结构

先创建基础的video/x-raw结构,再手动添加memory属性:

// 创建空Caps
GstCaps *caps = gst_caps_new_empty();
// 创建带属性的结构,其中memory属性指定为GBM
GstStructure *structure = gst_structure_new(
    "video/x-raw",
    "memory", G_TYPE_STRING, "GBM",
    "format", G_TYPE_STRING, "NV12",
    "framerate", GST_TYPE_FRACTION, 30, 1,
    "width", G_TYPE_INT, 1280,
    "height", G_TYPE_INT, 720,
    NULL);
// 将结构添加到Caps中
gst_caps_append_structure(caps, structure);

两种方式都能正确生成符合要求的Caps,避免结构名的字符验证错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 08:42:39