OpenCV编码为H264

14

我想在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的任何消息。

关于以前的OpenCV版本使用FFmpeg的文章有很多,包括(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();

5
为了使用h264编码,需要使用libx264编译您的ffmpeg。虽然解码器通常已经内置在软件中,但编码器却不一定存在。 - Dmitrii Z.
谢谢您的建议,不过这并不是我想要使用OpenCV的方式,而且会创建一个额外的ffmpeg dll,实际上使用了另一个外部库——除非您指的是重新编译opencv_ffmpeg库而不破坏OpenCV的兼容性? - Yost777
1
首先构建libx264,然后配置ffmpeg以使用libx264(ffmpeg是autotools项目,因此./configure应该会给您一个提示),然后构建ffmpeg,然后配置opencv以使用新构建的ffmpeg(opencv使用cmake构建,因此查看cmake输出以查看它是否使用正确的版本),最后构建opencv。这将导致支持H264编码的opencv_ffmpeg。 - Dmitrii Z.
我觉得在Windows上做这个是相当具有挑战性的(至少对于我来说,我更习惯在Unix上进行编程),但是如果环境良好,应该可以做到,祝你好运。也许值得为Windows搜索预构建的库。 - Dmitrii Z.
谢谢。我可以尝试构建OpenCV(之前尝试过但失败了)-使用这个最新的指南:http://www.learnopencv.com/install-opencv3-on-windows/ 我不知道如何包含自定义ffmpeg库、选项,更不用说如何将openx264放进去了。这似乎是一个重大操作,远离标准的OpenCV,只支持单个编码器。使用单独的编码库,如avcodec或openh264直接进行编码,似乎会更容易些。 - Yost777
1个回答

15

回答自己的问题 - 虽然感谢之前的建议 - 我现在已经成功创建并将帧写入到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库版本
- Yost777
更新:使用OpenCV 4.2.0 - 使用openh264 v1.8(openh264-1.8.0-win64.dll) - Yost777
1
使用opencv_contrib_python-4.2.0.34.dist-info和相同的设置以及openh264库版本可以正常工作。 - randomwalk1225

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接