我正在将OpenCV实现到c ++项目中,以便从图像帧创建视频。这通常在视频完全未压缩时起作用。为了减少大量的文件大小,我正在尝试使用ffmpeg,它与OpenCV一起提供。
cv::VideoWriter output_video = cv::VideoWriter(output_filename.c_str(), -1, 25, size);
在任何情况下,创建视频编写器对象时创建ffmpegWriter
都会失败。在单步执行OpenCV代码时,会加载opencv_ffmpeg.dll
库,并且各个函数的地址在库中成功定位。最后,到达以下代码(cap_ffmpeg.cpp
):
virtual bool open( const char* filename, int fourcc, double fps, CvSize frameSize, bool isColor )
{
icvInitFFMPEG::Init();
close();
if( !icvCreateVideoWriter_FFMPEG_p )
return false;
ffmpegWriter = icvCreateVideoWriter_FFMPEG_p( filename, fourcc, fps, frameSize.width, frameSize.height, isColor );
return ffmpegWriter != 0;
}
和icvCreateVideoWriter_FFMPEG_p
始终返回0.
OpenCV不提供由opencv_ffmpeg.dll
构建的调试(我在他们的网站上找到了一个没有可用的帖子)所以我没有可能进一步检查被调用函数中发生了什么。
我尝试使用OpenCV版本2.4.8,2.4.13.4和3.3.1,在所有情况下都得到相同的结果。 OpenCV是从源代码(HAVE_FFMPEG
)构建的,所有东西都在Visual Studio 2015中的Windows 10 64位机器上。
注意:这与所提供的文件名或fourcc代码不同,因为OpenCV会在评估任何其他内容之前尝试查找用于创建视频的工作API。在我的情况下,API是ffmpeg并且如上所述创建编写器失败。
cv::getBuildInformation()
的输出是:
....
FFMPEG: YES (prebuilt binaries)
avcodec: YES (ver 57.89.100)
avformat: YES (ver 57.71.100)
avutil: YES (ver 55.58.100)
swscale: YES (ver 4.6.100)
avresample: YES (ver 3.5.0)
....
有人知道这个问题可能是什么原因或我如何进一步调试这个问题?