OpenCV 编码为 H264

Posted

技术标签:

【中文标题】OpenCV 编码为 H264【英文标题】:OpenCV encoding to H264 【发布时间】:2018-02-15 22:36:48 【问题描述】:

我想在 OpenCV 中将图像编码为 H264 视频。

作为我的图像跟踪软件的一部分,我在 OpenCV 3.4(64 位)和 Visual Studio 2017 C++ 中使用 VideoWriter。我使用 ffmpeg 进行手动编码,并且随着 OpenCV 附带,我认为这是最好的选择。我的 OpenCV 版本表明它是用 ffmpeg 编译的,我可以验证它是否加载了 opencv_ffmpeg340_64.dll。

解码 H264 (AVC1) 绝对没问题,包括专门使用 ffmpeg API 时。但编码 MJPG 或原始图像以外的任何内容都不起作用: VideoWriter.Open() 主要返回 false,在某些情况下它只写入一个空的或小的标题,但不会写入帧。我不仅尝试了 ffmpeg API,还尝试了任何可用的 API。将控制台/调试输出重定向到 VC 中的中间窗口不会提供来自 OpenCV 或 ffmpeg 的任何消息。

有很多关于使用 FFmpeg 的 OpenCV 以前版本的帖子,包括 (Cisco) OpenH264 库和使用它的困难。我尝试了很多选项,安装编解码器包,包括 H264、ffmpeg 静态版本、Cisco openH264 库、设置路径等,甚至尝试了 OpenCV 中暴露的 cvCreateVideoWriter 等低级 ffmpeg 库函数,并使用不同的视频容器(AVI、MPG、 MP4) 以及fourcc 字符串。

我不敢相信在 2018 年,支持 FFmpeg 的出色 OpenCV 无法编码除了神秘的 MJPG 或原始图像之外的任何内容。如果它使用 FFmpeg,肯定应该有一组重要的功能可用?

虽然我认为这应该可行,但我的下一个最佳选择是使用单独的 ffmpeg 库,具有讽刺意味的是,它会在我想象的解决方案中添加另一个 ffmpeg.dll。任何建议表示赞赏!

代码片段(使用任何视频编码 API):

VideoWriter writer;
int codec = VideoWriter::fourcc('X', '2', '6', '4');
writer.open("test.avi", codec, 30, colorImage.size(), true);
writer.write(colorImage);
writer.release();

【问题讨论】:

libx264 编译你的ffmpeg 来编码h264。尽管解码器通常是从包装箱中发货的,但编码器很少是这样的。 感谢您的建议,尽管这不是我想要的那样使用 OpenCV,并且会创建一个额外的 ffmpeg dll,有效地使用另一个外部库 - 除非您指的是在不破坏 OpenCV 兼容性的情况下重新编译 opencv_ffmpeg 库? 你首先构建 libx264,然后配置 ffmpeg 使用 libx264(ffmpeg 是 autotools 项目,所以 ./configure 应该给你使用什么的提示),而不是构建 ffmpeg,然后配置 opencv 使用fresh构建 ffmpeg(opencv 是用 cmake 构建的,所以查看 cmake 输出以查看它是否使用正确的版本),而不是构建 opencv。它将导致 opencv_ffmpeg 支持 H264 编码。 我会说这在 Windows 上是一个相当大的挑战(至少对我来说,更习惯于在 unix 上进行编程),但在良好的环境下应该是可行的,所以祝你好运。也许值得为 Windows 搜索预建库。 谢谢。我可以尝试构建 OpenCV(我之前尝试过但失败了) - 使用这个最近的指南:learnopencv.com/install-opencv3-on-windows 我不知道如何包含自定义 ffmpeg 库、选项,更不用说如何在其中获取 openx264。这似乎是一项远离标准 opencv 的主要操作,仅支持单个编码器。使用单独的库进行编码似乎会容易得多,例如直接使用avcodec或openh264。 【参考方案1】:

要回答我自己的问题 - 不过感谢您之前的建议 - 我现在已经设法创建帧并将其写入 H264 视频,无需任何重新编译。这是我用过的:

使用 OpenCV 3.4.1 版 在与exe相同的文件夹中:opencv_ffmpeg341_64.dll(随OpenCV提供) 在同一文件夹中:openh264-1.7.0-win64.dll(来自:https://github.com/cisco/openh264/releases) 使用 OpenCV VideoWriter 类,省略特定的编码 API 容器:MP4 编解码器fourcc字符串:“H264”

我格式化了我的机器(Windows 10 64 位),所以我不能排除任何潜在的编解码器冲突问题 - 我还没有完全测试其他组合。由于这似乎是一个常见问题(存在许多误解),我希望这很有用。

【讨论】:

这也适用于: - OpenCV 4.0.0(使用匹配的 opencv 和 opencv_ffmpeg 库) - 相同的设置和 openh264 库版本 更新:使用 OpenCV 4.2.0 - 使用 openh264 v1.8 (openh264-1.8.0-win64.dll) 适用于 opencv_contrib_python-4.2.0.34.dist-info - 相同的设置和 openh264 库版本。

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

使用ffmpeg libavcodec将视频流编码为H264,为啥持续时间为零

如何将yuv编码为h264,自己编码或者ffmpeg都可以。

python保存h264格式视频(linux和windows)

FFmpeg简单使用:视频编码 ---- YUV转H264

h264多slice

h264编码基础