OpenCV输出视频为MP4无法播放的问题

今天写了一段代码,打开一段视频,然后再使用CV::VideoWriter保存处理后视频,结果能够成功保存但是打不开。
保存的代码如下:

pVideoPro->SetOutput("output001.mp4");

函数的内容如下所示

/******************************保存视频****************************/
bool VideoProcessor::SetOutput(const string& filename, int codec, double framerate, bool isColor)
{
    
    
	OutputFile = filename;
	if (framerate == 0.0)
		framerate = GetFrameRate();
	char c[4];
	if (codec == 0)
		codec = GetCodec(c);
	return MyWriter.open(OutputFile, codec, framerate, GetFrameSize(), isColor);
}

为什么我要保存成mp4呢,因为我打开的那个视频格式就是mp4格式的,运行程序以后,成功保存了视频,但是却打不开。
然后我就查看了GetCodec()函数的返回值,这个函数是要获取原视频的编码格式,具体代码如下:

int VideoProcessor::GetCodec(char codec[4])
{
    
    
	union {
    
    
		int value;
		char code[4];
	}returned;
	returned.value = static_cast<int>(MyCapture.get(CAP_PROP_FOURCC));
	codec[0] = returned.code[0];
	codec[1] = returned.code[1];
	codec[2] = returned.code[2];
	codec[3] = returned.code[3];
	return returned.value;
}

经过调试我发现返回值为:
在这里插入图片描述说明我这里的原视频为avc1编码格式的,然后我有将open函数中的codec函数修改为了-1,想要获取可选的编码方式,得到的结果如下
在这里插入图片描述可以看到,第二行就是之前我输入的avc1格式,可以看出来opencv是支持avc1这个编码格式的,但不知道为什么保存的视频就是打不开。
当我把保存文件的名称改为.avi格式以后

pVideoPro->SetOutput("output001.avi");

这时候保存的视频居然能够成功播放了,然后我又将open函数中的codec函数修改为了-1,发现.avi后缀可选的编码方式如下
在这里插入图片描述可以看出来,avc1编码格式也可以保存为.avi的格式的,但不知道为什么.mp4就不行.
最后我在官方中文文档中找到了答案,如下

这里写的内容建立在你已经通过OpenCV读取视频输入和相似度测量教程的假设,你知道如何读取视频文件。要创建视频文件,您只需要创建一个cv :: VideoWriter类的实例。您可以通过构造函数中的参数或稍后通过cv :: VideoWriter :: open函数指定其属性。无论哪种方式,参数是相同的:1.在其扩展名中包含容器类型的输出的名称。目前只支持avi。我们从输入文件构造这个,添加到要使用的通道的名称,并使用容器扩展名完成它。

就是说目前VideoWriter 这个类只支持.avi的后缀并不支持别的后缀

猜你喜欢

转载自blog.csdn.net/weixin_42411702/article/details/124045464