基于ROS2与OpenCV的C++ G-streamer视频流启动故障排查
问题分析与解决方案
1. 核心代码类型不匹配问题
你的代码中存在明显的类型错误:writer 是 cv::VideoWriter 栈对象,但你试图用 std::make_shared<cv::VideoWriter> 返回的智能指针直接赋值,这种类型不匹配会导致对象生命周期管理混乱,是引发后续问题的根源之一。
修正后的代码
方式1:使用智能指针管理
std::shared_ptr<cv::VideoWriter> writer; writer = std::make_shared<cv::VideoWriter>( "appsrc ! videoconvert ! videoscale ! video/x-raw,width=640,height=480 ! x264enc tune=zerolatency ! rtspclientsink location=rtsp://localhost:8554/mystream", cv::CAP_GSTREAMER, 0, 30.0, cv::Size(640, 480), true);
方式2:直接初始化栈对象
cv::VideoWriter writer( "appsrc ! videoconvert ! videoscale ! video/x-raw,width=640,height=480 ! x264enc tune=zerolatency ! rtspclientsink location=rtsp://localhost:8554/mystream", cv::CAP_GSTREAMER, 0, 30.0, cv::Size(640, 480), true);
2. GStreamer 编码器缺失问题
vaapih264enc依赖说明:该编码器是基于VA-API的硬件编码器,需要系统支持VA-API并安装对应插件。在Ubuntu/Debian上执行以下命令安装:sudo apt install gstreamer1.0-vaapi- 替代方案:如果硬件不支持VA-API或不想使用硬件编码,可改用软件编码器
x264enc,添加tune=zerolatency参数适配实时流场景(已在上面的修正代码中体现)。
3. libusb 引用计数断言失败问题
错误 libusb_ref_device: Assertion refcnt >=2 failed 通常源于设备引用计数管理错误,结合你的场景可按以下步骤排查:
- 先修复上述VideoWriter类型错误,确保对象生命周期管理正确,避免资源泄漏
- 检查相机SDK的设备初始化/释放逻辑:确保创建VideoWriter前,相机设备已被SDK正确初始化,且未提前释放
- 排查libusb版本冲突:若相机SDK与OpenCV依赖的libusb版本不一致,可尝试统一依赖版本,或在ROS2的
package.xml中明确声明正确的libusb依赖 - 调整资源释放顺序:程序退出时,先释放VideoWriter资源,再释放相机SDK的设备资源,避免资源竞争
内容的提问来源于stack exchange,提问作者Chris Mikkelsen
相关产品推荐
相关产品推荐

