现象与解决

开发环境:opencv4.6 , vs 2022。本地开发调试时打开视频是正常的:

1
2
3
4
5
6
VideoCapture cap;
cap.open(path);
if (!cap.isOpened()) { // check if we succeeded
std::cerr << "Couldn't open capture." << std::endl;
return -1;
}

但是经过Microsoft Visual Studio Installer Projects打包出来的程序,安装到别的电脑的时候,发现isOpened会返回false。在自己的开发电脑上安装是正常能用的。经搜索,排查尝试,初步估计是别的电脑上没有opencv_videoio_ffmpeg460_64.dll的问题。于是在我自己的开发电脑上,把Path里的opencv路径删除(D:\opencv\build\x64\vc15\bin),再次运行程序,确认重现bug,并把opencv_videoio_ffmpeg460_64.dll放到安装目录下,又恢复正常。到这里,就明白了,是需要把opencv_videoio_ffmpeg460_64.dll这个文件也打包到程序安装包中。

opencv打包需要额外带的dll

至于为什么opencv这么坑爹,不在程序中提示缺失opencv_videoio_ffmpeg460_64.dll而是单纯地让isOpened返回false,确实很迷。我c++的经验还不足以继续研究这个问题,等我经验够了这个问题应该自然就懂了,后续再补充原因说明吧。

附录