OpenCV videoWriter编解码器问题

Posted

技术标签:

【中文标题】OpenCV videoWriter编解码器问题【英文标题】:OpenCV videoWriter codec issue 【发布时间】:2013-11-30 12:48:48 【问题描述】:

我正在尝试在 Windows 中使用 OpenCV 编写视频,并且在选择编解码器时遇到了各种问题。我不确定它是否在我的代码中,或者我没有必要的编解码器。代码是:

int main(int argc, char ** argv)

        VideoCapture inputVideo("LFW.mp4");
        Mat inputFrame, outputFrame;
        VideoWriter outputVideo;

        if (!inputVideo.isOpened())
            std::cout << "!!! Input video could not be opened" << std::endl;
            return 1;
        

        int ex = static_cast<int>(inputVideo.get(CV_CAP_PROP_FOURCC));
        const string name = "Output.mp4";
        Size size = Size((int) inputVideo.get(CV_CAP_PROP_FRAME_WIDTH), (int) inputVideo.get(CV_CAP_PROP_FRAME_HEIGHT));
        outputVideo.open(name, CV_FOURCC('M','P','4','2'), inputVideo.get(CV_CAP_PROP_FPS), size, true);

        if (!outputVideo.isOpened())
            std::cout << "!!! Output video could not be opened" << std::endl;
            return 2;
        

        return 0;

代码一直以代码 2 退出,因此 videoWriter 对象对其配置不满意。

【问题讨论】:

我认为openCV只能写.avi文件。我一直在尝试用 python 编写 .mp4 文件,但没有成功 【参考方案1】:

Windows 上的许多编解码器都有问题。我已经正确安装了 ffmpeg,但仍然存在许多视频格式的问题。

试试这个 CV_FOURCC('W', 'M', 'V', '2')

VideoWriter video("Result.wmv", CV_FOURCC('W', 'M', 'V', '2'), 30, SizeOfFrame, true);

WMV 格式很糟糕,但对我来说非常完美。我正在使用 Visual Studio 2015 和我自己构建的 Opencv 3.0.0。

在 Opencv 3.0.0 中,我强烈建议也包含

#include "opencv2/imgcodecs/imgcodecs.hpp"
#include "opencv2/videoio/videoio.hpp"

还有一个建议。检查输入视频的大小和 VideoWriter 的大小。 CV_CAP_PROP_FRAME_WIDTH 和 CV_CAP_PROP_FRAME_HEIGHT 在某些情况下会返回错误值。在 video.write(Mat) 之前检查两种尺寸

您可以通过此循环检查您的视频作者。 将您的作家大小设置为虚拟常数。

大小 SizeOfFrame = cv::Size(800, 600);

VideoWriter video("Result.wmv", CV_FOURCC('W', 'M', 'V', '2'), 30, SizeOfFrame, true);

在视频循环中,将检索到的视频大小调整为与作者相同的大小。如果失败,您的安装可能是错误的。

   for (;;)
        
        bool Is = cap.grab();
           if (Is == false) 

           cout << "cannot grab video frame" << endl;

           
           else 
              cap.retrieve(LoadedImage, CV_CAP_OPENNI_BGR_IMAGE);


              resize(LoadedImage, LoadedImage, Size(800, 600));

              video.write(LoadedImage);
           
         

My Tutorial here

【讨论】:

【参考方案2】:

人们在使用 VideoCapture 和 VideoWriter 时遇到编解码器问题并不少见。 (另一个不太常见的问题是 OpenCV 在没有编码器的情况下编译(例如在编译 OpenCV 时使用 WITH_FFMPEG=NOWITH_VFW=NO

我会尝试以下方法来剖析问题(按所涉及的麻烦程度排序:)):

    尝试运行相同的程序,但将-1而不是CV_FOURCC('M','P','4','2')作为第二个参数传递给outputVideo.open()。然后,您将看到一个弹出窗口,要求您选择编解码器,然后可以查看 OpenCV 找到了哪些编解码器。

    如果这对您没有帮助 - 使用调试器进入 outputVideo.open()。你可能会得到一个空函数(#ifdefed 由于一些预处理器宏)。不幸的是,您必须有一个带有 pdb 文件的调试编译 OpenCV 才能正确执行此操作。

【讨论】:

如果我在第二个参数中输入 -1,我也不会收到弹出窗口。我在 Windows 上运行。

以上是关于OpenCV videoWriter编解码器问题的主要内容,如果未能解决你的问题,请参考以下文章

Opencv 编解码器选择对话框未显示

OpenCV videowriter 不写视频

GPU编解码GPU硬编码

python opencv videowrite不写视频

Raspberry Pi 4 中的 mp4 编解码器:不将帧写入视频

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