opencv 中,VideoWriter类 如果不能成功打开(也就是说 .isOpened()返回为false), 通常有两类主要原因。
1. 封装支持
保存文件名需要写明保存文件的封装格式,后缀为 .avi 可以成功打开编码器,本人试用过 .mp4, 未能打开。
2.编码格式支持
VideoWriter构造函数的第二个参数是一个代表编码格式的整数,它是通过指名编码格式的名称来转换的。例如
如果你不能正常保存视频,也有可能是你的系统没有对应的编码库。 指的是MJPEG 编码格式,那么需要你的系统里支持MJPEG编码(光支持解码是不够的)。本人的系统里面安装了ffmpeg(本人其他博文有ffmpeg 的安装方法), 在我编译opencv库时已经配置了这一选项。因此ffmpeg支持的编解码库,我的opencv 也是支持的。
ffmpeg -codecs 查询ffmpeg支持的编解码形式
例如: 查询是否支持264编码
ffmpeg -codecs | grep 264
ffmpeg version 2.2.1 Copyright (c) 2000-2014 the FFmpeg developers
built on Nov 10 2014 20:48:19 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
configuration:
libavutil 52. 66.100 / 52. 66.100
libavcodec 55. 52.102 / 55. 52.102
libavformat 55. 33.100 / 55. 33.100
libavdevice 55. 10.100 / 55. 10.100
libavfilter 4. 2.100 / 4. 2.100
libswscale 2. 5.102 / 2. 5.102
libswresample 0. 18.100 / 0. 18.100
D.V.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
最后一行告诉了我 H264只支持啦decoder, 没有encoder ,因此我的opencv 是不能支持264编码的。
如果我使用 CV_FOURCC('A','V','C', '1')参数,那么打开VideoWriter时会提示我无法打开,提示我安装libx264(一个开源的H264编解码库)
但是我使用 CV_FOURCC('D', 'I','V','X') CV_FOURCC(‘M’, 'J', ‘P’, 'G') 都可以正常打开
正常使用案例:
const char* fileName = "/home/sean/Projects/office_video_3.avi";
videoWriter = VideoWriter(fileName, CV_FOURCC('D', 'I','V','X'), 30, sizeTemp, true);
if(!videoWriter.isOpened())
{
cout<< "Error : fail to open video writer\n"<<endl;
return -1;
}
为了采集测试样本,昨晚自己在PC上搭了一个简单的DVR(结合了运动检测,因此录了13小时,只用来 500M磁盘空间),晚上11点下班时将它打开,第二天来到办公室,采集到了各位同仁上班的风采。