我正在尝试使用 Windows Media Foundation 类解码 mp4 视频,并将帧转换为可由 DirectX 着色器用于渲染的 2D 纹理。我已经能够使用读取源流MF从URL创建SourceReader并能够读取具有主要类型的流的媒体类型MFMEdiaType_Video和次要类型为MFVideoFormat_H264正如预期的那样。
我现在需要将此格式转换为 RGB 格式,该格式可用于初始化 D3D11_TEXTURE2D 资源和资源视图,然后将其传递到 HLSL 像素着色器进行采样。我已经厌倦了使用IMF变换类为我进行转换,但是当我尝试将转换上的输出类型设置为任何 MFVideoFormat_RGB 变体时,我收到错误。我还尝试在源阅读器上设置新的输出类型,并进行采样,希望获得正确格式的样本,但我再次没有运气。
所以我的问题是:
使用的操作系统是 Windows 7,因此我无法使用 SourceReaderEx 或 ID3D11VideoDevice 接口,因为据我所知,这些解决方案似乎仅在 Windows 8 上可用。
任何正确方向的帮助/指针将不胜感激,如果需要,我还可以提供一些源代码。
这种类型的转换可能吗?
对的,这是可能的。库存H.264 视频解码器 https://msdn.microsoft.com/en-us/library/windows/desktop/dd797815MFT 是“Direct3D 感知”,这意味着它可以利用 DXVA 将视频解码为 Direct3D 9 表面/Direct3D 11 纹理。或者,如果硬件能力不足,也可以采用软件回退模式。出于性能原因,您有兴趣将输出直接传递到纹理中(否则您必须自己加载此数据,从而消耗 CPU 和视频资源)。
这可以通过 IMFTransform/SourceReader 类来完成吗?就像我上面已经厌倦的那样,我是否只需要调整代码,或者我是否需要手动进行这种类型的转换?
IMFTransform
是抽象接口。它由 H.264 解码器(以及其他 MFT)实现,您可以直接使用它,或者您可以使用更高级别的 Source Reader API 来让它管理从文件读取视频并使用此 MFT 进行解码。
也就是说,MFT 和 Source Reader 实际上并不是唯一的替代选项,而是更高和更低级别的 API。 MFT 接口由解码器提供,您负责输入 H.264 并排出解码输出。 Source Reader 管理相同的 MFT 并添加文件读取功能。
来源阅读器 https://msdn.microsoft.com/en-us/library/windows/desktop/dd374655顺便说一句,它本身在 Windows 7 中可用(即使在 Vista 上,但与较新的操作系统相比,功能集可能会受到限制)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)