VideoCapture存储的avi视频文件无法打开的解决过程
最近在熟悉地平线的视频采集设备Matrix,网络上很多代码中用到了VideoCapture存储AVI格式的文件,但是,在我的系统上,生成的AVI文件始终无法打开。
代码如下:
#include "../include/opencv/opencv2/highgui.hpp"
#include "../include/opencv/opencv2/core.hpp"
using namespace cv;
using namespace std;
int main()
{
VideoCapture capture(0);
if (!capture.isOpened())
std::cout << "Video open failed" << endl;
int framecount = 0;
int dWidth = capture.get(CV_CAP_PROP_FRAME_WIDTH);
int dHeight = capture.get(CV_CAP_PROP_FRAME_HEIGHT);
int fps = capture.get(CV_CAP_PROP_FPS);
std::cout << "Witdh = " << dWidth <<" ; " << endl;
std::cout << "Height = " << dHeight << " ; " << endl;
std::cout << "FPS = " << fps << " ; " << endl;
Size frameSize(static_cast<int>(dWidth), static_cast<int>(dHeight));
VideoWriter writer("VideoTest.avi", CV_FOURCC('M', 'J', 'P', 'G'), 30, frameSize, true);
Mat frame(frameSize, CV_8UC3);
while (framecount < 300)
{
capture.read(frame);
writer.write(frame);
waitKey(10);
framecount = framecount + 1;
cout << "成功写入视频中,当前已写入帧数为: " << framecount << endl;
}
capture.release();
writer.release();
return 0;
}
查遍网络,主要有以下几种说法。
- 资源需要释放: capture.release(); writer.release();
- 存储的视频帧率要与摄像头的采集帧率保持一致;
- 存储的视频分辨率要与摄像头的分辨率保持一致;
好一通折腾后,将怀疑的目标转移到视频的编码格式,网络上百度到的大体是这样的:
使用工具VirtualDub查看了我系统中的编解码器,安装了MJPG编解码器PICVideo M-JPEG 4,才彻底解决了AVI文件不能被打开的问题,如下图。
总结,系统中的编解码器至关重要,开始忽略了,以为我的系统应该安装了,因为其他的软件生成的AVI文件是可以打开的。
最终我尝试了系统中支持的其他编码格式,并不仅限于图1中的那些编码格式,如下:CV_FOURCC(‘X’,‘V’,‘I’,‘D’);
CV_FOURCC(‘X’,‘2’,‘6’,‘4’);
CV_FOURCC(‘I’,‘Y’,‘U’,‘V’);
CV_FOURCC(‘I’,‘4’,‘2’,‘0’)
等等,生成的avi文件使用Windows Midea Player均可以打开。
今天总结到此。