Ubuntu20.04下C++调用OpenCV4.4.0触发GStreamer报错如何解决
Ubuntu 20.04 + OpenCV 4.4.0 GStreamer相关视频打开失败排查方案
报错信息中文翻译
- GStreamer致命错误:
GStreamer-CRITICAL **: 14:17:18.242: gst_element_make_from_uri: assertion 'gst_uri_is_valid (uri)' failed
含义:GStreamer关键接口调用失败,传入的URI不合法,断言校验未通过 - OpenCV警告:
含义:[ WARN:0] global /home/user/opencv-4.4.0/modules/videoio/src/cap_gstreamer.cpp (713) open OpenCV | GStreamer warning: Error opening bin: error de sintaxis [ WARN:0] global /home/user/opencv-4.4.0/modules/videoio/src/cap_gstreamer.cpp (480) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created- 打开GStreamer处理单元失败,存在语法错误
- GStreamer管道未成功创建,无法检查运行状态
- 最终错误:
Error opening video stream or file
含义:打开视频流或文件失败
排查步骤
校验传入的路径/URI合法性
首条报错已经明确指向URI校验失败,优先确认传给cv::VideoCapture的参数符合GStreamer规范:- 本地文件可直接传绝对路径,也可使用带file协议的格式
file:///home/用户名/视频文件.mp4,路径中不能包含未转义的中文、空格或特殊字符 - 网络流必须携带完整协议头,比如RTSP流格式为
rtsp://账号:密码@设备IP:端口/流地址,不能遗漏协议、端口或路径拼写错误
可直接在终端执行gst-play-1.0 你的路径/URI测试,若该命令无法正常播放,说明源本身或URI格式存在问题,与OpenCV无关。
- 本地文件可直接传绝对路径,也可使用带file协议的格式
确认OpenCV已正确编译GStreamer支持
先运行以下代码打印OpenCV编译配置,确认GStreamer支持已开启:#include <opencv2/opencv.hpp> int main() { std::cout << cv::getBuildInformation() << std::endl; return 0; }在输出的
Video I/O板块查找GStreamer项,确认状态为YES。如果状态为NO,需要先安装全套GStreamer依赖:sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav安装完成后重新编译OpenCV,编译时添加参数
-D WITH_GSTREAMER=ON。强制指定其他视频后端绕开问题
如果不需要使用GStreamer的自定义管道功能,可在初始化cv::VideoCapture时强制指定其他后端,直接绕开GStreamer校验:- 打开本地文件、网络流:
cv::VideoCapture cap(你的路径, cv::CAP_FFMPEG); - 打开本地USB摄像头:
cv::VideoCapture cap(0, cv::CAP_V4L2);
调整后如果可以正常打开视频,说明问题确实出在GStreamer配置环节,可根据自身需求选择继续修复GStreamer配置,或直接使用其他后端。
- 打开本地文件、网络流:
自定义GStreamer管道语法校验
如果你是直接传入自定义GStreamer管道字符串给cv::VideoCapture,报错中的error de sintaxis为西班牙语的“语法错误”,说明管道字符串本身存在拼写、格式问题,比如管道连接符!前后未加空格、元素名称拼写错误、参数配置非法等。可先将管道字符串复制到终端,执行gst-launch-1.0 你的管道字符串测试能否正常运行,确认管道本身无问题后再放到OpenCV中调用。
内容的提问来源于stack exchange,提问作者Luigi619
相关产品推荐
相关产品推荐

