Yos*_*777 6 c++ video opencv 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的任何消息。
关于使用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();
Run Code Online (Sandbox Code Playgroud)
要回答我自己的问题-尽管谢谢您的先前建议-我现在已经设法创建了H264视频并将其写入其中,而无需进行任何重新编译。这是我用过的:
我格式化了计算机(Windows 10 64位),因此不能排除任何潜在的编解码器冲突问题-我还没有针对其他组合进行全面测试。由于这似乎是一个常见问题(存在许多误解),所以我希望这是有用的。