运行时设置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
相关产品推荐
相关产品推荐

