在C++中使用媒体基础和Windows 8捕获时出现问题

Problems capturing with Media Foundation & Windows 8 in C++

本文关键字:问题 Windows C++ 媒体      更新时间:2023-10-16

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

我制作了一个MF捕获视频应用程序,基于Microsoft的示例"CaptureToFile"。它确实在Windows 7 x64上工作。我顺利升级到Visual Studio 2013。当我试图把所有的开发都放在Windows 8.1 x64机器上时,出现了问题。

该应用程序编译和执行没有错误,但在异步模式下使用m_pReader->ReadSample()无法捕获样本;只有前两个样本到达OnReadSample方法;并且必须有"控制"样本,因为IMFSample在所有样本中都为null。之后,该应用程序会被挂起等待数据。

我尝试过原始的MFCaptureToFile样本,结果也很糟糕。

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

你知道这种行为可能的原因吗?在Win7中,一切都完美无瑕!或者至少,如果你能让我了解一下寻找的新途径

提前感谢

更新:游戏中有另一个"玩家"。查看线程,我发现一个工作线程位于实时工作队列容器"RTWorkQ.dll"中,该容器仅适用于Windows 8。我将继续调查。在此期间,如果你有什么想法,有什么要分享的,我很乐意听你的。

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

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

更新4:我已经在Windows8PRO中安装了VisualStudio2010Ultimate。示例MFCaptureToFile在该示例中再次失败。它无法从帧抓取器读取第二个样本。我开始认为捕获卡(Datapath VisionRGB-E1S)和Windows 8 PRO之间可能不兼容,尽管驱动程序确保它在这个平台上运行良好,并且测试程序显示图像。明天我将用一个外部USB网络摄像头进行测试。

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

随着Windows 8.1的发布,微软推出了适用于Windows 8.1的新AVStream接口KS_FRAME_INFO结构中有一个很小但非常重要的更改,即新的FrameCompletionNumber成员。

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

DirectShow不在乎这个数字。媒体基金会也很关心。

所以,你不能只在用户模式方面解决这个问题。制造开发人员必须发布更新。顺便说一句,我有两个网络摄像头-罗技C270和创意直播社交高清。罗技支持Metro,而创意则不支持。

我只使用了几行代码就成功地更新了我的驱动程序(以正确设置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,然后将其作为当前媒体类型应用于读取器。