OpenCV2.1 生成视频选择编码的 bug
最近使用 OpenCV2.1 来生成视频,在 Windows 下碰到这样的问题:不管我用什么样的编码,都没有办法直接生成视频,并且会导致程序崩溃。代码如下:
_writer = cvCreateVideoWriter( video.c_str(), CV_FOURCC('X','V','I','D'), _fps, cvSize(frameW,frameH), isColor );
但是,如果我把编码换上 -1 选项来手工选取视频格式,则能顺利生成视频。代码如下:
_writer = cvCreateVideoWriter( video.c_str(), -1, _fps, cvSize(frameW,frameH), isColor );
这个应该是 OpenCV2.1 里的一个 Bug,换成 OpenCV2.2 就没有这个问题了。
OpenCV2.2 的 Visual Studio 2008 问题
官方的 OpenCV2.2 是在 Visual Studio 2010 下编译的二进制包,所以,当你把 OpenCV2.2 嵌入到 Visual Studio 2008 里,可以正常编译相关的代码,但是一运行,一定会提示找不到动态链接库 msvcp100d.dll 或是 msvcr100d.dll 。
这个时候,你可以把这两个 Visual Studio 2010 的动态链接库拷贝到编译好的可执行文件目录里。但是,最好的方式,是你在 Visual Studio 2008 里重新编译一下 OpenCV2.2。
OpenCV 读取视频帧与 DirectShow 读取视频的步调不一致
有一些视频,我用 OpenCV 跳转到指定的时间,和用 DirectShow 跳转到视频指定的时间,理论上来说,应该是一样的。可是,在我这里,偏偏就出现了跳转视频位置不同的情况。而且,原始视频越长,这种误差越大。
是什么原因呢?
仔细研究了一下,我用 OpenCV 读取参数,会显示是 29 帧/秒,大约有 276168 帧;但是用 DirectShow 解码后显示为 30 帧/秒,计算后约为 268946 帧。
解码后的度量时间标准不同,也就导致了上述误差。但是,真实的原因是什么呢?