opencv VideoWriter 保存的视频无法打开原因(详细注释)2020-09-05 11:47:38
//opencv 4.3 保存摄像头视频功能
VideoCapture cap;
cap.open(0);//如果是个网络摄像头,需要IP地址及尾部参数,这个参数有方法可以直接获取,比如192.168.0.10/camera0,这个值是可以通过一个软件来获取的
VideoWriter write;
string outVideo = "Show_Example.avi";
int fps = 24.0;//帧率double fps=cap.get(CV_CAP_PROP_FPS);//本地摄像头返回为会0,只有在打开视频文件的时候才能获取帧率;这地方不妨用一个随意值,顶多影响播放效果
int height = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_HEIGHT));//读取视频的高度
int width = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_WIDTH));//读取视频的宽度
//创建文件并设置相应参数,其中编码有五六种,如果设置为-1,会让用户手动选择,如果有特殊要求可以指定为需求值;最后的true带表采色图像,要与视频一致
write.open(outVideo, CV_FOURCC('M', 'P', '4', '2'), fps, Size(width, height), true);
qDebug("width/height: %d / %d", width, height);//在console的黑框中会输出对应宽高,注意宽高不能搞反
while (1){
Mat frame;
cap >> frame;
if (frame.empty())
{
cout << "Finish" << endl;
break;
}
write.write(frame);//将每一帧写入文件
imshow("Input video", frame);
waitKey(30);//这是显示刷新间隔意思,如果是0,将不刷新,固定图像,这个函数与保存视频功能无关
if (char(waitKey(1)) == 'q') break;//这个重要,只要记住如果不跳出,下面的release得不到执行,占用了文件也会造成文件无法打开
}
write.release();//这算个坑,如果保存的文件无法打开,要确定这一步被执行了,不要直接点Debug测试的停止,会造成文件破损无法打开,实测按q退出就可以了,否则,文件就打不开,也可以放到某个析构中确保执行
cap.release();
//代码实测有效!