Linux下GStreamer fallbacksrc无法链接glimagesink的解决咨询
GStreamer fallbacksrc 与 glimagesink 配合运行问题解决
问题场景
使用fallbacksrc插件时,搭配ximagesink的命令可正常执行:
gst-launch-1.0 fallbacksrc \ uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm \ fallback-uri=file:///path/to/some/jpg \ ! videoconvert \ ! ximagesink
但将sink替换为glimagesink后执行失败,报错信息如下:
thread '<unnamed>' panicked at 'called `Result::unwrap()` on an `Err` value: Noformat', utils/fallbackswitch/src/fallbacksrc/imp.rs:1897:36 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace fatal runtime error: failed to initiate panic, error 5
环境信息
- GStreamer版本:1.22(通过ArchLinux官方软件源安装)
- gst-plugins-rs版本:0.9.7(通过ArchLinux用户软件源AUR安装)
原因分析
glimagesink仅支持处理GL纹理格式的视频数据(对应caps类型为video/x-raw(memory:GLMemory)),而fallbacksrc和videoconvert输出的是系统内存中的video/x-raw格式,两者内存类型不兼容导致caps协商失败,触发Noformat错误。仅添加capsfilter video/x-raw无法解决内存类型不匹配的问题。
解决方法
方法1:添加glupload转换内存格式
在videoconvert之后插入glupload元素,将系统内存中的视频帧转换为GL纹理格式,再交给glimagesink:
gst-launch-1.0 fallbacksrc \ uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm \ fallback-uri=file:///path/to/some/jpg \ ! videoconvert \ ! glupload \ ! glimagesink
方法2:使用GL管线内的格式转换
用glvideoconvert替代videoconvert,同时先通过glupload将数据转入GL管线:
gst-launch-1.0 fallbacksrc \ uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm \ fallback-uri=file:///path/to/some/jpg \ ! glupload \ ! glvideoconvert \ ! glimagesink
方法3:强制指定输出格式(可选)
如果需要更精确控制格式,可以在fallbacksrc后添加capsfilter指定具体的raw格式参数,再配合glupload:
gst-launch-1.0 fallbacksrc \ uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm \ fallback-uri=file:///path/to/some/jpg \ ! capsfilter caps="video/x-raw,format=RGBx,width=640,height=480" \ ! videoconvert \ ! glupload \ ! glimagesink
内容的提问来源于stack exchange,提问作者takaomag
相关产品推荐
相关产品推荐

