用opencv的videocapture把videocapture读入的数据保存成新的视频,代码很简单,首先打开一个输出视频流:
cv::VideoWriter video(video_name, CV_FOURCC('M','J','P','G'), 30, cv::Size(640,480), false);
然后往里写数据:
video << frame;
最后关闭视频流:
video.release()
上面是核心代码,注意,size可以通过cap设置属性,这样会更好些
cv::VideoWriter video(video_name, CV_FOURCC('M','P','4','V'), 30, cv::Size(cap.get(3),cap.get(4)), true);
But,我写入的视频大小始终是5.7kb,上网查找后,很多人对这个问题展开讨论:
https://github.com/ContinuumIO/anaconda-issues/issues/223
上面是一些不错的建议,供参考。
看完这些回答,还是没能解决我的问题。
继续搜罗答案:
http://cn.voidcc.com/question/p-kaflvmog-rt.html
于是我把视频编码格式改成了mp4v:
cv::VideoWriter video(video_name, CV_FOURCC('M','P','4','V'), 30, cv::Size(640,480), false);
但还是老问题。
后来,我发现VideoWriter构造函数的最后一个参数“isColor”,在我的程序里设成false是有问题的,因为我的input是3通道的彩色图,于是换成true:
cv::VideoWriter video(video_name, CV_FOURCC('M','P','4','V'), 30, cv::Size(640,480), true);
问题解决!
总结:
- 检查视频编码格式,大概率是MJPEG格式不被机器支持(哪怕装了FFMPEG并且FFMPEG is working well),尝试下其他的格式。
- 如果你的input image是彩色图,那么不要把videowriter的构造函数最后一个参数的isColor设为false,要设成true才可以。false只针对灰度图。
- 视频后缀就用.avi,它是个container,codec(编解码器)才是important thing!
- videowriter构造函数中设置的video size要和实际写入的image size match,否则不会写入正确的视频