Windows Media Foundation:IMFSourcereader :: SetCurrentMediat

Windows Media Foundation: IMFSourceReader::SetCurrentMediaType execution time issue

本文关键字:IMFSourcereader SetCurrentMediat Foundation Media Windows      更新时间:2023-10-16

我当前正在从视频捕获设备检索图像数据。对我来说,重要的是,我具有相当特定的格式的原始输出数据,并且需要连续的数据流。因此,我想使用IMFSourcereader。我非常了解它的工作原理。对于整个管道,我检查了相机的输出格式,并查看了可用的媒体基础转换(MFTS(。

这里的关键功能是IMFSourceReader::SetCurrentMediaType。我想详细说明我发现的一个关键功能。如果我只将函数与所需的输出格式的参数一起使用,它会更改一些参数,例如fps或分辨率,但呼叫成功。当我第一次使用我所需参数的本机媒体类型调用该函数时,错误 subtype(例如mjpg或sth。(,然后用我所需的参数再次调用它, creork subtype呼叫成功,我最终得到了正确的参数。我怀疑这是正确的,如果可以使用安装MFT(解码器(。

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

所以有人知道这个问题并且可以快速解决吗?

或任何人都知道:

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

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

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

请注意,您可以通过应用诸如MF_READWRITE_DISABLE_CONVERTERS之类的某些属性来禁用源读取器的转换,在这种情况下,无法直接在源上设置视频格式将导致故障。

您还可以通过将数据馈送到一个或一个MFT链中来读取原始设备格式的数据并解码/转换/处理。通常,当您在源阅读器上设置各自的格式时,源阅读器会为您管理MFT。但是,如果您愿意,您也可以自己做。不幸的是,您无法为源阅读器构建一系列MFT链。您要么将其完全放在源阅读器上,要么设置本机媒体类型,而是从读者中读取原始格式的数据,然后通过执行IMFTransform::ProcessInputIMFTransform::ProcessOutput和朋友来管理MFTS。这不像源阅读器那样容易,但可行。

由于Vuvirt不想写任何答案,所以我想为他和每个遇到相同问题的人添加一个答案。

在某些情况下,呼叫IMFSourceReader::SetCurrentMediaType需要很长时间,而目标格式为RGB,并且本地不可用。因此,为了摆脱它,我调整了图像管道以能够解释YUV(YUY2(。我仍然不知道,为什么是这种情况,但这对我来说是一个工作。我不知道有任何替代方法可以加快呼叫的速度。

附加提示:我发现通常有几种iMftransforms可以解释YUY2的许多本地可用格式。因此,如果您能够使用YUY2,则可以安全。NV12是另一种工作选择。虽然可能还有更多。

感谢您的回答