寻找几天的解释后,这将是我在StackOverflow中的第一个问题。求求你了,请问我要温柔些,因为我知道我的问题有点奇怪,这是一个普遍的问题。
我基于Microsoft示例“ CaptureToFile”制作了一个MF捕获视频应用程序。它确实可以在Windows 7 x64上运行。我没有问题地升级到了Visual Studio 2013。当我尝试将所有开发都放在Windows 8.1 x64计算机上时,出现了问题。
该应用程序可以编译并执行,没有错误,但是无法通过在异步模式下使用m_pReader-> ReadSample()来捕获样本。仅前两个样本到达OnReadSample方法;并且必须有“控制”样本,因为IMFSample在所有样本中均为null。之后,该应用将“挂起”以等待数据。
我已经尝试了原始的MFCaptureToFile示例,但结果却相同。
当然,我认为硬件和软件是相似的(相同的采集卡和相同的驱动程序版本,都是台式机...)
您知道这种行为的任何可能原因吗?在Win7中,一切正常!或者至少,如果您能向我介绍一些新的途径来发现正在发生的事情
提前致谢
更新:游戏中还有另一个“玩家”。查看这些线程,我发现一个工作线程位于实时工作队列容器“ RTWorkQ.dll”中,仅适用于Windows8。我将继续进行调查。同时,如果您有任何想法要分享的东西,我很高兴听到您的声音。
更新2:我修改了示例MFCaptureToFile以同步获取视频样本,因为我认为问题可能是由于异步行为引起的。与队列有关。我必须说,即使进行了此更改,问题仍然存在。第二次尝试读取样本时,应用程序被“挂起”,等待永远不会到达的读数。
更新3:我已经尝试过使用另一种MF方式捕获视频(MFCaptureEngine)的CaptureEngine示例应用程序。它可以完美地构建和运行,但是在启动“预览”时不显示任何图像,并且不记录任何有用的,只能播放的文件。
更新4:我已经在Windows 8 PRO中安装了Visual Studio 2010 Ultimate。在示例MFCaptureToFile示例再次失败。它无法从抓帧器中读取第二个样本。我开始认为这可能是捕获卡(Datapath VisionRGB-E1S)与Windows 8 PRO之间的不兼容,尽管驱动程序确保它在该平台上可以正常工作,并且测试程序可以显示图像。明天我将使用外部USB网络摄像头进行测试。
最后,我已经弄清楚了这个问题的原因。
在Windows 8.1版本中,Microsoft引入了Windows 8.1的新AVStream接口。KS_FRAME_INFO结构中有一个很小但非常重要的更改-新的FrameCompletionNumber成员。
已完成队列中帧的标识序列号。此数字用于验证正确的帧顺序。当该值为0时,该帧被取消。此成员从Windows 8.1开始可用。
DirectShow不在乎这个数字。和MediaFoundation关心。
因此,您不能仅在用户模式端解决此问题。制造商开发人员必须发布更新。顺便说一句,我有两个网络摄像头-Logitech C270和Creative Live Socialize HD。Logitech支持Metro,而Creative不支持。
我仅用几行代码就成功更新了驱动程序(以正确设置FrameCompletionNumber)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句