如何让GStreamer的playbin优先使用v4l2convert替代videoscale/videoconvert?
让GStreamer的playbin优先使用v4l2convert替代videoscale/videoconvert
我的硬件搭载专有Scaler驱动,gst-inspect能看到v4l2convert元素。手动构建管道时,v4l2convert可以正常完成缩放:
gst-launch-1.0 filesrc location=4k_input.h264 ! queue ! h264parse ! v4l2h264dec ! v4l2convert ! video/x-raw,width=1920,height=1080 ! waylandsink
但使用playbin时,GStreamer会先通过videoconvert/videoscale完成缩放,再将视频传给v4l2convert。我已经把v4l2convert的rank从0改成256(videoscale和videoconvert的rank是64),但问题依旧,希望让playbin直接用v4l2convert完成缩放。
解决方案
1. 利用playbin的video-filter属性指定处理逻辑
playbin的video-filter属性用于定义解码后到视频sink之间的视频处理滤镜。直接将v4l2convert设置为该滤镜,并嵌入分辨率约束,就能让解码后的视频直接进入v4l2convert完成格式转换和缩放,避免GStreamer自动插入videoscale/videoconvert:
gst-launch-1.0 playbin uri=file:////home/root/4k_input.h264 video-filter="v4l2convert ! video/x-raw,width=1920,height=1080" video-sink="waylandsink"
2. 临时降低videoscale和videoconvert的优先级
通过环境变量临时将videoscale和videoconvert的rank设为0,强制GStreamer优先选择rank更高的v4l2convert:
GST_PLUGIN_FEATURE_RANK=videoscale:0 GST_PLUGIN_FEATURE_RANK=videoconvert:0 gst-launch-1.0 playbin uri=file:////home/root/4k_input.h264 video-sink="v4l2convert ! video/x-raw,width=1920,height=1080 ! waylandsink"
3. 代码层面自定义playbin内部结构(进阶)
如果是通过GStreamer开发而非命令行使用,可以通过GstPlay相关API替换playbin默认的视频转换/缩放元素,直接将v4l2convert注入到解码后的处理链路中。
内容的提问来源于stack exchange,提问作者Rohit Walavalkar
相关产品推荐
相关产品推荐

