C++ 在 OpenCV 中使用 H.264 压缩编写视频文件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/28163201/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-28 20:55:08  来源:igfitidea点击:

Writing a video file using H.264 compression in OpenCV

c++opencvimage-processingcomputer-visionvideo-processing

提问by kauDaOtha

How do I write a video using H.264 compression with the VideoWriter class in OpenCV? I basically want to get a video from the webcam and save it after a character is pressed. The ouput video file is huge when using MPEG4 Part 2 compression.

如何使用 OpenCV 中的 VideoWriter 类使用 H.264 压缩编写视频?我基本上想从网络摄像头获取视频并在按下字符后保存它。使用 MPEG4 Part 2 压缩时输出的视频文件很大。

回答by rayryeng

You can certainly use the VideoWriterclass, but you need to use the correct FourCC codethat represents the the H264 standard. FourCC stands for Four Character Code, which is an identifier for a video codec, compression format, colour or pixel format used in media files.

您当然可以使用VideoWriter该类,但是您需要使用代表 H264 标准的正确 FourCC 代码。FourCC 代表四字符代码,它是媒体文件中使用的视频编解码器、压缩格式、颜色或像素格式的标识符。

Specifically, when you create a VideoWriterobject, you specify the FourCC code when constructing it. Consult the OpenCV docs for more details: http://docs.opencv.org/trunk/modules/highgui/doc/reading_and_writing_images_and_video.html#videowriter-videowriter

具体来说,当您创建一个VideoWriter对象时,您在构造它时指定 FourCC 代码。有关更多详细信息,请参阅 OpenCV 文档:http: //docs.opencv.org/trunk/modules/highgui/doc/reading_and_writing_images_and_video.html#videowriter-videowriter

I'm assuming you're using C++, and so the definition of the VideoWriterconstructor is:

我假设您使用的是 C++,因此VideoWriter构造函数的定义是:

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

filenameis the output of the video file, fourccis the FourCC code for the code you wish to use, fpsis the desired frame rate, frameSizeis the desired dimensions of the video, and isColorspecifies whether or not you want the video to be in colour. Even though FourCC uses four characters, OpenCV has a utility that parses FourCC and outputs a single integer ID which is used as a lookup to be able to write the correct video format to file. You use the CV_FOURCCfunction, and specify four single characters - each corresponding to a single character in the FourCC code of the codec you want. Note that CV_FOURCCis for OpenCV 2.x. It is recommended you use cv::Videowriter::fourccfor OpenCV 3.x and beyond.

filename是视频文件的输出,fourcc是您希望使用的代码的 FourCC 代码,fps是所需的帧速率,frameSize是所需的视频尺寸,并isColor指定您是否希望视频为彩色。尽管 FourCC 使用四个字符,OpenCV 有一个实用程序可以解析 FourCC 并输出单个整数 ID,该 ID 用作查找以便能够将正确的视频格式写入文件。您使用该CV_FOURCC函数,并指定四个单个字符 - 每个字符对应于所需编解码器的 FourCC 代码中的单个字符。请注意,这CV_FOURCC是针对 OpenCV 2.x。建议您使用cv::Videowriter::fourccOpenCV 3.x 及更高版本。

Specifically, you would call it like this:

具体来说,你会这样称呼它:

int fourcc = CV_FOURCC('X', 'X', 'X', 'X');
int fourcc = VideoWriter::fourcc('X', 'X', 'X', 'X');

Replace Xwith each character that belongs to the FourCC (in order). Because you want the H264 standard, you would create a VideoWriterobject like so:

替换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;
}

Alternatively, you could simply do this when declaring your VideoWriterobject:

或者,您可以在声明VideoWriter对象时简单地执行此操作:

VideoWriter outputVideo(filename, fourcc, fps, S);

If you use the above, it's not required that you call openas this will automatically open up the writer for writing frames to file.

如果您使用上述方法,则不需要调用,open因为这将自动打开编写器以将帧写入文件。



If you're not sure if H.264 is supported on your computer, specify -1as the FourCC code, and a window should pop up when you run the code that displays all of the available video codecs that are on your computer. I'd like to mention that this only works for Windows. Linux or Mac OS doesn't have this window popping out when you specify -1. In other words:

如果您不确定您的计算机是否支持 H.264,请将其指定-1为 FourCC 代码,当您运行该代码时,应该会弹出一个窗口,该窗口显示您计算机上的所有可用视频编解码器。我想提一下,这仅适用于 Windows。当您指定-1. 换句话说:

VideoWriter outputVideo(filename, -1, fps, S);

You can choose which one is most suitable should H.264 not exist on your computer. Once that is done, OpenCV will create the right FourCC code to be input into the VideoWriterconstructor so that you will get a VideoWriter instance that represents a VideoWriterthat will write that type of video to file.

如果您的计算机上不存在 H.264,您可以选择最合适的一种。完成后,OpenCV 将创建正确的 FourCC 代码以输入到VideoWriter构造函数中,以便您将获得一个 VideoWriter 实例,该实例表示VideoWriter将将该类型的视频写入文件。

Once you have a frame ready, stored in frmfor writing to the file, you can do either:

准备好框架并存储在其中frm以写入文件后,您可以执行以下任一操作:

outputVideo << frm; 

OR

或者

outputVideo.write(frm);


As a bonus, here's a tutorial on how to read/write videos in OpenCV: http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html- However, it's written for Python, but what is good to know is near the bottom of the link, there is a list of FourCC codes that are known to work for each operating system. BTW, the FourCC code they specify for the H264 standard is actually 'X','2','6','4', so if 'H','2','6','4'doesn't work, replace Hwith X.

作为奖励,这里有一个关于如何在 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'不起作用,请替换HX.

Another small note. If you are using Mac OS, then what you need to use is 'A','V','C','1'or 'M','P','4','V'. From experience, 'H','2','6','4'or 'X','2','6','4'when trying to specify the FourCC code doesn't seem to work.

另一个小笔记。如果您使用的是 Mac OS,那么您需要使用的是'A','V','C','1''M','P','4','V'。根据经验,'H','2','6','4'或者'X','2','6','4'在尝试指定 FourCC 代码时似乎不起作用。