C++ 在OpenCV中使用H.264压缩编写视频文件
如何使用OpenCV中的VideoWriter类使用H.264压缩编写视频?我基本上想从网络摄像头中获取视频,并在按下角色后保存它。使用MPEG4第2部分压缩时,输出视频文件很大。您当然可以使用C++ 在OpenCV中使用H.264压缩编写视频文件,c++,opencv,image-processing,computer-vision,video-processing,C++,Opencv,Image Processing,Computer Vision,Video Processing,如何使用OpenCV中的VideoWriter类使用H.264压缩编写视频?我基本上想从网络摄像头中获取视频,并在按下角色后保存它。使用MPEG4第2部分压缩时,输出视频文件很大。您当然可以使用VideoWriter类,但您需要使用代表H264标准的类。FourCC代表四个字符的代码,它是媒体文件中使用的视频编解码器、压缩格式、颜色或像素格式的标识符 具体来说,当您创建一个VideoWriter对象时,在构造它时指定FourCC代码。有关更多详细信息,请参阅OpenCV文档: 我假设你使用C++
VideoWriter
类,但您需要使用代表H264标准的类。FourCC代表四个字符的代码,它是媒体文件中使用的视频编解码器、压缩格式、颜色或像素格式的标识符
具体来说,当您创建一个VideoWriter
对象时,在构造它时指定FourCC代码。有关更多详细信息,请参阅OpenCV文档:
我假设你使用C++,所以<代码>视频监视器< /C>构造函数的定义是:
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\u FOURCC
用于OpenCV 2.x。建议您对OpenCV 3.x及更高版本使用cv::Videowriter::fourcc
具体来说,您可以这样称呼它:
int fourcc = CV_FOURCC('X', 'X', 'X', 'X');
int fourcc = VideoWriter::fourcc('X', 'X', 'X', 'X');
将X
替换为属于FourCC的每个字符(按顺序)。因为您想要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;
}
如果使用上述方法,则无需调用open
,因为这将自动打开writer以将帧写入文件
如果您不确定您的计算机是否支持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;
作为奖励,这里有一个关于如何在OpenCV中读/写视频的教程:-然而,它是为Python编写的,但值得一提的是,在链接的底部,有一个已知适用于每个操作系统的FourCC代码列表。顺便说一句,他们为H264标准指定的四个CC代码实际上是
'X','2','6','4'
,因此如果'H','2','6','4'
不起作用,请用X
替换H
另一张小纸条。如果您使用的是Mac OS,那么您需要使用的是
'A','V','C','1'
或'M','P','4','V'
。根据经验,'H'、'2'、'6'、'4'
或'X'、'2'、'6'、'4'
尝试指定FourCC代码时似乎不起作用。对于H.264,大多数人使用AVC,因此
cv2.VideoWriter_fourcc('a','v','c','1'))
mp4v
似乎也适用于许多人。我试过这个程序。首先,当我尝试将Fourcc参数用作-1时,没有弹出窗口。当我尝试使用您提到的x264时,我得到了“无法打开编解码器:libx264”错误和一些其他错误,如“检测到损坏的ffmpeg默认设置”。。顺便说一句,我使用ubuntu 14.04,这意味着你没有H264库。。。。这是另一篇文章。当我开始工作时,我会给你一个链接。顺便说一句-1只在Windows中工作。我也忘了提那件事。哎呀!非常感谢。当您进行h264 lib安装时,请务必通知我。我需要知道你是否这样做,还要注意fps
现在是double
@YunusTemurlenk。你可以使用cv::imwrite
并指定不同的图像格式和不同的压缩选项。上述方法仅适用于视频,因此您绝对不应使用此方法。有关示例,请参见。
outputVideo << frm;
outputVideo.write(frm);