如何通过Gst.Pipeline为videoconvert元素添加属性及转换字符串管线?
GStreamer 两个问题的解决方法
一、将字符串管线转为Gst.Pipeline实例
直接用Gst.parse_launch()函数就能搞定,它可以把你熟悉的字符串格式管线直接解析成Gst.Pipeline(或Gst.Bin)实例,示例代码:
import gi gi.require_version('Gst', '1.0') from gi.repository import Gst Gst.init(None) # 字符串格式的管线 pipeline_str = "<some src...> ! videoconvert ! video/x-raw,format=I420 ! <some enc...>" # 解析为Pipeline实例 pipeline = Gst.parse_launch(pipeline_str) # 后续可正常操作管线,比如启动 pipeline.set_state(Gst.State.PLAYING)
二、正确设置videoconvert后的格式约束
你之前的错误核心是:video/x-raw,format=I420并不是videoconvert的属性,它是一个格式过滤器(Caps Filter),需要单独创建这个元素,或者在链接元素时指定格式约束。
方法1:创建capsfilter元素(对应字符串管线的写法)
import gi gi.require_version('Gst', '1.0') from gi.repository import Gst Gst.init(None) # 创建管线和各个元素 pipeline = Gst.Pipeline.new("my-pipeline") src = Gst.ElementFactory.make("<your-src-element>", "src") convert = Gst.ElementFactory.make("videoconvert", "convert") # 创建格式过滤器并设置目标格式 caps_filter = Gst.ElementFactory.make("capsfilter", "caps-filter") caps_str = "video/x-raw,format=I420" caps = Gst.Caps.from_string(caps_str) caps_filter.set_property("caps", caps) encoder = Gst.ElementFactory.make("<your-enc-element>", "encoder") # 将所有元素添加到管线 elements = [src, convert, caps_filter, encoder] for elem in elements: pipeline.add(elem) # 依次链接元素 Gst.Element.link_many(src, convert, caps_filter, encoder) # 启动管线 pipeline.set_state(Gst.State.PLAYING)
方法2:链接时用link_filtered直接指定格式
如果不想单独创建capsfilter元素,可以用link_filtered方法在链接videoconvert和编码器时直接指定格式约束:
# 前面创建src、convert、encoder的步骤同上 # 先链接src到convert src.link(convert) # 用link_filtered链接convert和encoder,传入目标格式caps convert.link_filtered(encoder, caps)
这两种写法都能实现和字符串管线! videoconvert ! video/x-raw,format=I420 !完全一致的格式约束效果。
内容的提问来源于stack exchange,提问作者HiRod
相关产品推荐
相关产品推荐

