这将是我的第一个问题在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
,然后作为当前媒体类型应用于阅读器。