在C ++中使用Media Foundation&Windows 8捕获问题

这将是我的第一个问题在StackOverflow几天后寻找一个解释。 请温柔地问我,因为我知道我的问题有点奇怪是一个普遍的问题。

我制作了一个基于微软示例“CaptureToFile”的MF捕捉video应用程序。 它确实在Windows 7 x64上工作。 我升级到Visual Studio 2013没有问题。 当我尝试在Windows 8.1 x64机器上进行所有的开发时出现问题。

该应用程序编译和执行没有错误,但它是无法通过在asynchronous模式下使用m_pReader-> ReadSample()捕获采样; 只有前两个样本到达OnReadSample方法; 并且必须有“控制”样本,因为IMFSample全部为空。 之后,应用程序被“吊”等待数据。

我已经尝试了原始MFCaptureToFile样品,同样的悲伤结果。

当然,我觉得硬件和软件是相似的(相同的驱动程序版本的捕获卡,都是台式电脑…)

你知道这种行为的可能原因吗? 在Win7中,一切都是无懈可击的! 或者至less,如果你能点亮一些关于寻找新事物的新途径

提前致谢

更新:游戏中还有另外一个“玩家”。 纵观线程,我发现一个工作线程在'RTWorkQ.dll',实时工作队列容器中,只针对Windows 8。我将继续研究。 同时,如果您有任何想法,可以分享,我很乐意听到您的声音。

更新2:我修改了示例MFCaptureToFile同步获取video样本,因为我认为这个问题可能是由于asynchronous行为; 与队列有关。 我不得不说,即使这个变化,问题仍然存在。 第二次尝试阅读样本时,应用程序被“吊死”,等待阅读不会永远不会到来。

更新3:我已经尝试使用捕获video(MFCaptureEngine)的另一种MF方式的CaptureEngine示例应用程序。 它的构build和运行完美无瑕,但是在开始“预览”时不会显示任何图像,也不会logging任何有用的,只有非可播放的文件。

更新4:我已经在Windows 8 PRO中安装了Visual Studio 2010 Ultimate。 样本MFCaptureToFile在样本中再次失败。 无法从图像采集卡读取第二个采样。 我开始认为这可能是采集卡(Datapath VisionRGB-E1S)和Windows 8 PRO之间的不兼容,尽pipe驱动程序确保在此平台上正常工作,并且testing程序显示图像。 明天我要用外置的USBnetworking摄像机来testing。

最后,我找出了这个问题的原因。

在Windows 8.1版本中,Microsoft已经推出了用于Windows 8.1的新AVStream接口。在KS_FRAME_INFO结构 – 新的FrameCompletionNumber成员中有一个很小但非常重要的改变。

已完成队列中帧的标识序列号。 这个数字用于验证正确的帧顺序。 当这个值是0时,帧被取消。 该成员从Windows 8.1开始可用。

DirectShow不关心这个数字。 而MediaFoundation关心。

所以,你不能只是修复你的用户模式。 制造商必须发布更新。 顺便说一句,我有两个摄像头 – 罗技C270和创新Live社交HD。 罗技支持Metro,而Creative则不支持。

我只用几行代码就成功更新了我的驱动程序(正确设置FrameCompletionNumber)。

UPD。 类似的线程http://www.osronline.com/showthread.cfm?link=255004

这一定是图像采集卡Datapath VisionRGB-E1S的问题。 我已经尝试了全新的USB摄像头LifeCam Studio,一切正常。

我将留给未来的其他线程为什么这种Windows 8和Windows 7之间的不成对的行为,但它可能是相关的用户模式访问…

我有同样的问题:

  • IMFSourceReader获得成功

  • reader->SetCurrentMediaType()报告没有错误。

  • reader->ReadSample()成功。

那么OnReadSample()仅被调用一次,而hrStatus参数为0x80070491

对我来说,问题是我修改了视频子类型IMFMediaType ,然后作为当前媒体类型应用于阅读器。