OpenCV编码为H264

时间:2018-02-15 22:36:48

标签: c++ opencv video ffmpeg video-encoding

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

作为我的图像跟踪软件的一部分,我使用Visual Studio 2017 C ++在OpenCV 3.4(64位)中使用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静态版本,思科openH264库,设置路径等的编解码器包,甚至尝试了低级别的ffmpeg库函数,如在OpenCV中公开的cvCreateVideoWriter,并使用不同的视频容器(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();

1 个答案:

答案 0 :(得分:6)

回答我自己的问题 - 感谢您之前的建议 - 我已经成功创建并编写了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
  • Codec fourcc string:“H264”

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