如何创建名称含括号的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
相关产品推荐
相关产品推荐

