我目前正在从视频捕获设备中检索图像数据。
对我而言,重要的是我拥有相当特定格式的原始输出数据,并且我需要一个连续的数据流。因此,我想使用IMFSourceReader。我非常了解它是如何工作的。为了使整个管道正常工作,我检查了摄像机的输出格式,并查看了可用的Media Foundation Transforms(MFT)。
此处的关键功能是IMFSourceReader::SetCurrentMediaType
。我想阐述一下我发现的一项关键功能。如果仅将函数与所需输出格式的参数一起使用,它将更改某些参数,例如fps或resolution,但调用成功。当我第一次使用本机媒体类型调用具有所需参数和错误的子类型(例如MJPG或sth。)的函数,并再次使用所需参数和正确的子类型调用该函数时,调用成功,最后我得到我正确的参数。我怀疑只有在可以使用合适的MFT(解码器)的情况下,这才是正确的。
到目前为止,我已经击败了WMF以获得我想要的东西。现在的问题是,第二次IMFSourceReader::SetCurrentMediaType
调用需要很长时间。持续时间在很大程度上取决于所使用的相机。从0.5s到10s不等。老实说,我真的不知道为什么要花这么长时间,但是我认为正确的转换路径的计算和/或转换的初始化是问题所在。我认识到过多的加载和卸载相同的dll(ntasn1.dll,ncrypt.dll,igd10iumd32.dll)。但是一旦我加载它们并没有改变任何东西。
那么,有人知道此问题并对此有快速解决方案吗?
还是有人知道可以解决以下问题:
IMFSourceReader
? 最佳答案
您基本上描述了Source Reader首先应该工作的方式。基础媒体源具有其自己的媒体类型,并且如果读者需要适合所请求的媒体类型和最接近的原始媒体,则读者可以提供转换。
视频捕获设备往往会公开许多[本机]媒体类型(我有一个网络摄像头,其中列举了475种!),因此,如果格式调整不顺利,源阅读器可能会花费一些时间尝试一种或另一种转换。
请注意,您可以通过应用像MF_READWRITE_DISABLE_CONVERTERS
这样的certain attributes来禁用源阅读器的转换,在这种情况下,无法直接在源上设置视频格式将导致失败。
您还可以读取原始设备格式的数据,并通过将数据馈入一个或一系列MFT来自己解码/转换/处理。通常,当您在源阅读器上设置各自的格式时,源阅读器将为您管理MFT。但是,如果您愿意,也可以自己做。不幸的是,您无法建立供源代码阅读器管理的MFT链。您可以将其完全留在源阅读器中,或者设置本机媒体类型,从阅读器中以原始格式读取数据,然后通过执行IMFTransform::ProcessInput
,IMFTransform::ProcessOutput
和 friend 来管理MFT。这不像源阅读器那么容易,但是是可行的。