VS环境下OpenCV C++视频播放中途触发调试报错中断
问题原因
崩溃和运行库配置、日志中显示的部分dll加载失败无关:日志里debug版ffmpeg、GTK、TBB、OpenMP等插件加载失败是Windows环境下的正常现象,当前release版ffmpeg插件已经加载成功,视频解码链路是正常的。
触发断言崩溃的直接原因:
- 代码使用无条件死循环读取视频帧,当视频播放到末尾、或者遇到损坏帧读取出错时,
cap.read(img)会返回失败,此时img是空Mat对象,宽高属性均为0 - 代码未做读取结果校验,直接将空Mat传入
imshow,触发了size.width>0 && size.height>0的判断条件,程序直接终止。
修复代码
修复后代码增加了打开状态校验、读帧结果校验、主动退出逻辑,可直接替换原有代码:
#include<opencv2/imgcodecs.hpp> #include<opencv2/highgui.hpp> #include<opencv2/imgproc.hpp> #include<iostream> using namespace std; using namespace cv; int main() { string path = "Resources/test_video.mp4"; VideoCapture cap(path); // 校验视频文件是否成功打开 if (!cap.isOpened()) { cout << "视频打开失败,请检查文件路径是否正确" << endl; return -1; } Mat img; while (true) { // 读取单帧,ret为false表示读帧失败/到达视频末尾 bool ret = cap.read(img); if (!ret) { cout << "视频播放结束或读帧异常,退出播放" << endl; break; } imshow("Image", img); // 按q键可主动退出,waitKey参数控制播放间隔,单位ms if (waitKey(20) == 'q') { break; } } // 释放占用资源 cap.release(); destroyAllWindows(); return EXIT_SUCCESS; }
补充说明
waitKey的参数直接影响播放速度,数值越小播放速度越快,如果需要匹配视频原始帧率,可以用waitKey(1000 / cap.get(CAP_PROP_FPS))替换固定值。- 如果视频还未播放到末尾就触发读帧失败,一般是视频文件损坏、或者视频编码不被当前版本ffmpeg支持,可将视频转码为H.264编码的MP4格式后再测试。
- 日志中显示的各类插件加载失败提示不需要额外处理,Windows环境下OpenCV默认使用Win32UI作为显示后端,不需要GTK相关依赖,并行计算相关的TBB/OpenMP插件缺失也不会影响基础的视频播放功能。
内容的提问来源于stack exchange,提问作者cosmic643
相关产品推荐
相关产品推荐

