我正在videoInput(DirectShow的薄包装)上开发一个小型视频捕获库,最近遇到了一个棘手的问题。
该库使用以下代码将视频帧捕获并保存为其内部格式:
if (VI->setupDevice(m_deviceIndex, width, height)) {
//... checks for frame size etc
//...
auto pixels = VI->getPixels(m_deviceIndex, true, true);
}
此代码是使用vc140 / sdk8.1在VS 2017中构建的,并且可以在运行Windows 7、8.1和10的各种不同计算机上正常运行,这些计算机包括典型的办公台式机和笔记本电脑,数台开发机,高度限制的生产桌面和VirtualBox来宾。
然后,我们发现在一台Windows 7计算机上,即使摄像机本身可以与其他应用程序正常工作,videoInput也会产生黑帧(零像素)。我们测试了几种不同型号的相机,以达到相同的效果。
我从官方Microsoft repository构建了DirectShow示例,并发现在启动时,无论以提升模式运行,示例都将失败,并出现hr = 0x80070005错误(访问被拒绝)。 Here's发生错误的位置(amcap.cpp,第787行)。
由于官方示例应该可以直接使用,所以我怀疑更高版本的SDK / MSVC中可能存在兼容性错误,因此尝试使用VS 2010进行编译,但这没有帮助。我还尝试了不同的捕获后端,使用来自同一存储库的Windows Media Foundation example以及带有ffmpeg的OpenCV-都具有相同的效果。
然后,我们发现了另一台运行Windows 10的计算机,该计算机具有完全相同的问题,表明这不是向后兼容性的问题。同时,相同的版本在我的测试机上运行良好,而Webcamoid之类的第三方应用程序在有问题的PC上运行良好。
我的最佳猜测是,必须授予某种兼容性标志或权限,因为该相机可以与第三方软件配合使用,但是我不知道在哪里寻找它们,而Windows 7却不知道该怎么做。如果我没记错的话,首先不要设置相机许可设置。
现在,有人知道地球上可能有什么问题吗?我将不胜感激任何建议。
谢谢。
答案 0 :(得分:1)
问题已解决。
原来,该问题是由于Kaspersky Endpoint Security引起的,该选项可以限制未知应用程序的视频流。这就是为什么商店中的摄像头应用程序运行良好(默认情况下它们是受信任的),而我们的应用程序却没有运行的原因。
偷闲者。