记录总结可用方法
OpenCV有一个类cv::VideoWriter专门用来把视频保存到文件的,但VideoWriter不仅仅是将原始图像流保存到文件,它还可以对视频编码,然后以某种封装格式(比如AVI/MP4)将视频流写到文件中。其实这个VideoWriter底层也是调用了FFmpeg的多媒体文件处理功能,OpenCV只是借用了FFmpeg的能力,在上面封装多了一层。因为OpenCV的长项是在图像处理,如果要针对多媒体文件做复杂的处理,推荐的还是用FFmpeg 专业库。
VideoWriter使用
用 OpenCV 保存视频非常简单,通过调用它的 VideoWriter 这个类就好了。

cv::VideoWriter::VideoWriter( const String & filename,
int 	apiPreference,
int 	fourcc,
double 	fps,
Size 	frameSize,
bool 	isColor = true 
)

第一个参数是要保存的文件的路径
fourcc 指定编码器
fps 要保存的视频的帧率
frameSize 要保存的文件的画面尺寸
isColor 指示是黑白画面还是彩色的画面 isColor如果非零,编 码器将希望得到彩色帧并进行编码;否则是灰度帧(只有在Windows下支持这个标志)。

什么是fourcc?
fourcc 本身是一个 32 位的无符号数值,用 4 个字母表示采用的编码器。
常用的有 “DIVX"、”MJPG"、“XVID”、“X264"建议使用CV_FOURCC(‘M’, ‘P’, ‘4’, ‘2’) 其是生成文件占用空间最小的编码方式

fourcc为 四个字符用来表示压缩帧的codec 例如:
CV_FOURCC(‘P’,‘I’,‘M’,‘1’) = MPEG-1 codec
CV_FOURCC(‘M’,‘J’,‘P’,‘G’) = motion-jpeg codec
CV_FOURCC(‘M’, ‘P’, ‘4’, ‘2’) = MPEG-4.2 codec
CV_FOURCC(‘D’, ‘I’, ‘V’, ‘3’) = MPEG-4.3 codec
CV_FOURCC(‘D’, ‘I’, ‘V’, ‘X’) = MPEG-4 codec
CV_FOURCC(‘U’, ‘2’, ‘6’, ‘3’) = H263 codec
CV_FOURCC(‘I’, ‘2’, ‘6’, ‘3’) = H263I codec
CV_FOURCC(‘F’, ‘L’, ‘V’, ‘1’) = FLV1 codec

#include <stdio.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;


int main()
{
	VideoCapture cap(0);

	if (!cap.isOpened())
	{
		printf("open video failed!\n");
		return 1;
	}

	Mat Frame;

	//设置保存的视频帧数目
	int frameNum = 500;
	//保存视频的路径
	string outputVideoPath = "..\\test.avi";
	//获取当前摄像头的视频信息
	cv::Size sWH = cv::Size((int)cap.get(CV_CAP_PROP_FRAME_WIDTH),
		(int)cap.get(CV_CAP_PROP_FRAME_HEIGHT));
	VideoWriter outputVideo;
	outputVideo.open(outputVideoPath, CV_FOURCC('M', 'P', '4', '2'), 30, sWH);

	while (cap.isOpened() && frameNum > 0)
	{
		cap >> Frame;
		if (Frame.empty()) break;
		outputVideo << Frame;
		frameNum--;

		imshow("img", Frame);
		waitKey(10);

		if (char(waitKey(1)) == 'q') break;
	}

	outputVideo.release();
	system("pause");
}

可能遇到的问题:

1.打不开视频或摄像头
①.本地视频的输入路径有问题,例如下面所示:
string outputVideoPath = “C:\Users\Test\Testopencv\3.avi”;

上述方式会因为转义符而出现问题。
正确的路径命名方式为:

string outputVideoPath = “C:\Users\Test\Testopencv\3.avi”;
string outputVideoPath = “C:/Users/Test/Testopencv/3.avi”;

②.摄像头前几帧出现空帧
解决办法:多次加载视频,cap>>Frame直至图像不为空
③.编码格式不对
在open函数中第二个参数是编码格式,一定按照提供的编码格式进行填写,在应用中最好的解决方法是为-1。

2.保存文件为空

可能是后缀名的问题,尝试使用.avi。

3.保存文件打不开

可能是帧率及图像宽高设置有误,遇到录制视频无法打开的情况,除了检查代码之外,记得考虑下摄像头的编码格式。