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

运行时设置GstCaps:GStreamer动态修改视频分辨率求助

GStreamer动态修改视频分辨率实现步骤

1. 调整GStreamer管线结构

把原管线中硬编码的静态caps替换为命名的capsfilter元素,这样才能动态修改分辨率参数:

...
"! vaapih264enc name=encoder rate-control=cbr quality-level=7 keyframe-period=8 ",
"! capsfilter name=encoder_caps ",  // 替换原来的静态caps行
"! h264parse config-interval=1 ",
...

2. 获取capsfilter元素

和获取encoder的方式一致,通过名称递归查找:

GstElement *caps_filter = gst_bin_get_by_name_recurse_up(GST_BIN(media), "encoder_caps");

3. 创建新的GstCaps对象

构造包含目标分辨率的caps,按需修改width、height及其他属性:

// 示例:设置为1280x720的约束基线profile
GstCaps *new_caps = gst_caps_new_simple(
    "video/x-h264",
    "profile", G_TYPE_STRING, "constrained-baseline",
    "width", G_TYPE_INT, 1280,
    "height", G_TYPE_INT, 720,
    NULL
);

4. 应用新的caps到capsfilter

通过g_object_set设置capsfilter的caps属性:

g_object_set(caps_filter, "caps", new_caps, NULL);

5. 资源清理与管线同步

  • 释放caps对象和capsfilter引用,避免内存泄漏:
gst_caps_unref(new_caps);
gst_object_unref(caps_filter);
  • 可选:阻塞encoder的sink pad并发送flush事件,确保管线正确协商新caps:
// 阻塞pad防止数据混乱
gst_pad_set_blocked(sink, TRUE);
// 发送flush事件触发管线重新协商
gst_element_send_event(encoder, gst_event_new_flush_start());
gst_element_send_event(encoder, gst_event_new_flush_stop(FALSE));
// 解除阻塞
gst_pad_set_blocked(sink, FALSE);

注意事项

  • 确保VAAPI硬件编码支持目标分辨率,否则vaapih264enc可能报错
  • 修改分辨率前最好暂停管线,或者通过pad阻塞保证数据一致性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:42:38