Windows Media Foundation:IMFSourceReader :: SetCurrentMediaType执行时间问题

时间:2017-05-02 14:44:10

标签: c++ winapi image-processing video ms-media-foundation

我目前正致力于从视频捕捉设备中检索图像数据。 对我来说,重要的是我有一个特定格式的原始输出数据,我需要一个连续的数据流。因此我想使用IMFSourceReader。我非常了解它是如何工作的。为了使整个管道工作,我检查了摄像机的输出格式,并查看了可用的Media Foundation Transforms(MFT)。

这里的关键功能是IMFSourceReader::SetCurrentMediaType。我想详细说明我发现的一个关键功能。如果我只使用具有所需输出格式参数的函数,它会更改一些参数,如fps或分辨率,但调用成功。当我第一次使用具有所需参数的本机媒体类型和错误的子类型(如MJPG或某事物)调用该函数时,使用我所需的参数再次调用它并正确子类型调用成功,我最终得到了正确的参数。如果适合的MFT(解码器)可用,我怀疑这是真的。

到目前为止,我几乎击败了WMF以获得我想要的东西。现在的问题是,IMFSourceReader::SetCurrentMediaType的第二次调用需要很长时间。持续时间很大程度上取决于使用的相机。从0.5秒到10秒不等。说实话,我真的不知道为什么它花了这么长时间,但我认为正确的转换路径的计算和/或转换的初始化是问题。我认识到相同dll(ntasn1.dll,ncrypt.dll,igd10iumd32.dll)的加载和卸载量过大。但是加载它们一次我自己没有改变任何东西。

那么有人知道这个问题并快速解决它吗?

或者有人知道如何解决:

  1. 通过媒体基础获取原始图像数据,而不使用IMFSourceReader
  2. 自己选择并加载转换,以支持源阅读器调用?

2 个答案:

答案 0 :(得分:0)

你基本上描述了Source Reader应该首先工作的方式。底层媒体源具有自己的媒体类型,如果需要适合所请求的媒体类型和最接近的原始媒体,则读者可以提供转换。

视频捕获设备倾向于暴露许多[本机]媒体类型(我有一个网络摄像头,其中列举了其中的475个!),因此如果格式拟合不顺利,源阅读器可能需要一些时间来尝试一次或另一次转换。

请注意,您可以通过应用MF_READWRITE_DISABLE_CONVERTERS IMFTransform::ProcessInput来禁用源阅读器的转换,在这种情况下,无法直接在源上设置视频格式会导致失败。

您还可以通过将数据输入一个或一组MFT来读取原始设备格式的数据并自行解码/转换/处理。通常,当您在源阅读器上设置相应的格式时,源阅读器会为您管理MFT。如果您愿意,也可以自己动手。遗憾的是,您无法构建供源阅读器管理的MFT链。要么将其完全保留在源阅读器上,要么设置原生媒体类型,您从阅读器中读取原始格式的数据,然后通过执行IMFTransform::ProcessOutput,{{1}}来管理您身边的MFT。朋友。这并不像源阅读器那么容易,但是可行。

答案 1 :(得分:0)

由于VuVirt不想写任何答案,我想为他和每个有相同问题的人添加一个答案。

在某些情况下,当目标格式为某种RGB且本机不可用时,调用IMFSourceReader::SetCurrentMediaType需要很长时间。所以为了摆脱它,我调整了我的图像管道,以便能够解释YUV(YUY2)。我仍然不知道,为什么会这样,但这对我来说是一项有效的工作。我不知道任何替代方案可以加快通话速度。

附加提示:我发现通常有几种IMFTransforms可以将许多本机可用格式解码为YUY2。所以,如果你能够使用YUY2,那么你是安全的。 NV12是另一种可行的替代方案。虽然可能还有更多。

谢谢你的回答