如何在OpenCV中通过VideoWriter类使用H.264压缩编写视频?我基本上想从网络摄像头中获取视频并在按下角色后将其保存。使用MPEG4 Part 2压缩时,输出视频文件很大。
最佳答案
您当然可以使用VideoWriter
类,但是您需要使用代表H264标准的the correct FourCC code。 FourCC代表四个字符代码,它是媒体文件中使用的视频编解码器,压缩格式,颜色或像素格式的标识符。
具体来说,当创建VideoWriter
对象时,在构造它时要指定FourCC代码。有关更多详细信息,请查阅OpenCV文档:http://docs.opencv.org/trunk/modules/highgui/doc/reading_and_writing_images_and_video.html#videowriter-videowriter
我假设您使用的是C++,因此VideoWriter
构造函数的定义为:
VideoWriter::VideoWriter(const String& filename, int fourcc,
double fps, Size frameSize, bool isColor=true)
filename
是视频文件的输出,fourcc
是您要使用的代码的FourCC代码,fps
是所需的帧速率,frameSize
是所需的视频尺寸,isColor
指定是否要使用视频颜色。即使FourCC使用四个字符,OpenCV仍具有用于解析FourCC并输出单个整数ID的实用程序,该ID用于查找,以便能够将正确的视频格式写入文件。您使用CV_FOURCC
函数,并指定四个单个字符-每个对应于所需编解码器的FourCC代码中的单个字符。请注意CV_FOURCC
适用于OpenCV2.x。建议您将cv::Videowriter::fourcc
用于OpenCV 3.x及更高版本。具体来说,您可以这样称呼它:
int fourcc = CV_FOURCC('X', 'X', 'X', 'X');
int fourcc = VideoWriter::fourcc('X', 'X', 'X', 'X');
用属于FourCC的每个字符替换
X
(按顺序)。因为您需要H264标准,所以可以创建一个VideoWriter
对象,如下所示:#include <iostream> // for standard I/O
#include <string> // for strings
#include <opencv2/core/core.hpp> // Basic OpenCV structures (cv::Mat)
#include <opencv2/highgui/highgui.hpp> // Video write
using namespace std;
using namespace cv;
int main()
{
VideoWriter outputVideo; // For writing the video
int width = ...; // Declare width here
int height = ...; // Declare height here
Size S = Size(width, height); // Declare Size structure
// Open up the video for writing
const string filename = ...; // Declare name of file here
// Declare FourCC code - OpenCV 2.x
// int fourcc = CV_FOURCC('H','2','6','4');
// Declare FourCC code - OpenCV 3.x and beyond
int fourcc = VideoWriter::fourcc('H','2','6','4');
// Declare FPS here
double fps = ...;
outputVideo.open(filename, fourcc, fps, S);
// Put your processing code here
// ...
// Logic to write frames here... see below for more details
// ...
return 0;
}
另外,您可以在声明
VideoWriter
对象时执行以下操作:VideoWriter outputVideo(filename, fourcc, fps, S);
如果使用上面的方法,则不需要调用
open
,因为这会自动打开写入器以将框架写入文件。如果不确定计算机是否支持H.264,请指定
-1
作为FourCC代码,并且当您运行显示计算机上所有可用视频编解码器的代码时,将弹出一个窗口。我想提一下,这仅适用于Windows。当您指定-1
时,Linux或Mac OS不会弹出此窗口。换一种说法:VideoWriter outputVideo(filename, -1, fps, S);
如果计算机上不存在H.264,则可以选择最合适的一种。完成此操作后,OpenCV将创建正确的FourCC代码以输入到
VideoWriter
构造函数中,这样您将获得一个表示VideoWriter
的VideoWriter实例,该实例会将这种类型的视频写入文件。一旦准备好框架并将其存储在
frm
中以写入文件,则可以执行以下任一操作:outputVideo << frm;
要么
outputVideo.write(frm);
另外,这是一个有关如何在OpenCV中读取/写入视频的教程:http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html-但是,它是为Python编写的,但是您可以知道,在链接底部附近是一个众所周知的FourCC代码列表为每个操作系统工作。顺便说一句,他们为H264标准指定的FourCC代码实际上是
'X','2','6','4'
,因此,如果'H','2','6','4'
不起作用,请将H
替换为X
。另一个小注意事项。如果您使用的是Mac OS,则需要使用
'A','V','C','1'
或'M','P','4','V'
。根据经验,尝试指定FourCC代码时,'H','2','6','4'
或'X','2','6','4'
似乎不起作用。关于c++ - 在OpenCV中使用H.264压缩编写视频文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28163201/