我想在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();
libx264
编译您的ffmpeg
。虽然解码器通常已经内置在软件中,但编码器却不一定存在。 - Dmitrii Z.