使用Media Foundation& amp; Windows 8的C ++版

时间:2014-02-27 11:55:43

标签: c++ windows visual-studio-2013 ms-media-foundation

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

我制作了一个基于Microsoft示例'CaptureToFile'的MF捕获视频应用程序。它确实适用于Windows 7 x64。我没有问题地升级到Visual Studio 2013。当我尝试将所有开发放在Windows 8.1 x64计算机上时出现问题。

应用程序编译并执行时没有错误,但是在异步模式下使用 m_pReader-> ReadSample()来捕获样本是不可行的;只有前两个样本到达OnReadSample方法;并且必须有“控制”样本,因为IMFSample在所有样本中都为空。之后,应用程序被“绞死”等待数据。

我尝试了原始的MFCaptureToFile样本,结果令人遗憾。

当然,我认为硬件和软件是相似的(相同的驱动程序版本的捕获卡,都是台式PC ......)

你知道这种行为的任何可能原因吗?在Win7中,一切都在完美无瑕!或者至少,如果你可以点一点关于找到正在发生的事情的新途径

提前致谢

更新:游戏中还有另一个“玩家”。查看线程,我看到一个工作线程在“RTWorkQ.dll”中,即实时工作队列容器,仅适用于Windows 8.我将继续调查。与此同时,如果您有任何想法,可以分享一些内容,我会很高兴听到您的意见。

更新2:我已经修改了样本MFCaptureToFile以同步获取视频样本,因为我认为问题可能是由于异步行为;与队列相关。我要说的是,即使有这种变化,问题仍然存在。第二次尝试读取样本时,应用程序被“挂起”等待一个永远不会到来的读数。

更新3:我尝试过使用另一种MF方式捕获视频的CaptureEngine示例应用程序(MFCaptureEngine)。它可以完美地构建和运行,但在启动“预览”时不显示任何图像,并且不记录任何有用的,只有不可播放的文件。

更新4:我在Windows 8 PRO中安装了Visual Studio 2010 Ultimate。样本中的样本MFCaptureToFile再次失败。它无法从帧抓取器中读取第二个样本。我开始认为这可能是捕获卡(Datapath VisionRGB-E1S)和Windows 8 PRO之间的不兼容性,尽管驱动程序确保它在此平台中正常工作并且测试程序显示图像。明天我将尝试使用外部USB网络摄像头进行测试。

3 个答案:

答案 0 :(得分:2)

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

借助Windows 8.1发布,Microsoft引入了New AVStream Interfaces for Windows 8.1 KS_FRAME_INFO结构中有一个很小但非常重要的变化 - 新的FrameCompletionNumber成员。

  

已完成队列中帧的标识序列号。   此编号用于验证正确的帧顺序。当这个值是   0,框架被取消了。该会员可从以下开始   Windows 8.1。

DirectShow不关心这个号码。 MediaFoundation关心。

因此,您无法在用户模式方面进行修复。制造商必须发布更新。顺便说一下,我有两个网络摄像头 - 罗技C270和Creative Live Socialize HD。 Logitech支持Metro,而Creative则不支持。

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

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

答案 1 :(得分:0)

一定是帧抓取器Datapath VisionRGB-E1S的问题。我尝试过使用全新的USB网络摄像头LifeCam Studio,一切正常。

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

答案 2 :(得分:0)

我遇到了同样的问题:

  • IMFSourceReader已成功获取

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

  • reader->ReadSample()成功。

然后OnReadSample()只被调用一次而hrStatus参数0x80070491

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