这将是我在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网络摄像头进行测试。
答案 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
,然后将其作为当前媒体类型应用于阅读器。