OpenCV编码为H264
OpenCV encoding to H264
我想在 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() 主要是 returns 错误,在某些情况下它只写一个空的或小的 header 但不会写帧。我不仅尝试了 ffmpeg API,还尝试了任何可用的 API。将 console/debug 输出重定向到 VC 中的中间 window 不会给出来自 OpenCV 或 ffmpeg 的任何消息。
有很多关于使用 FFmpeg 的 OpenCV 早期版本的帖子,包括 (Cisco) OpenH264 库和使用它的困难。我尝试了很多选项,安装编解码器包,包括 H264、ffmpeg 静态版本、Cisco 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();
回答我自己的问题 - 感谢您之前的建议 - 我现在已经设法创建帧并将其写入 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 class,省略特定编码 API
- 容器:MP4
- 编解码器 fourcc 字符串:"H264"
我格式化了我的机器(Windows 10 64 位)所以我不能排除任何潜在的问题 codec-clashing - 我还没有完全测试其他组合。由于这似乎是一个很常见的问题(有很多误解),我希望这对您有用。
我想在 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() 主要是 returns 错误,在某些情况下它只写一个空的或小的 header 但不会写帧。我不仅尝试了 ffmpeg API,还尝试了任何可用的 API。将 console/debug 输出重定向到 VC 中的中间 window 不会给出来自 OpenCV 或 ffmpeg 的任何消息。
有很多关于使用 FFmpeg 的 OpenCV 早期版本的帖子,包括 (Cisco) OpenH264 库和使用它的困难。我尝试了很多选项,安装编解码器包,包括 H264、ffmpeg 静态版本、Cisco 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();
回答我自己的问题 - 感谢您之前的建议 - 我现在已经设法创建帧并将其写入 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 class,省略特定编码 API
- 容器:MP4
- 编解码器 fourcc 字符串:"H264"
我格式化了我的机器(Windows 10 64 位)所以我不能排除任何潜在的问题 codec-clashing - 我还没有完全测试其他组合。由于这似乎是一个很常见的问题(有很多误解),我希望这对您有用。