video - Windows Media Foundation 使用 IMFTransform 将 mp4 电影帧解码为 2D 纹理

标签 video windows-7 mp4 directx-11 ms-media-foundation

我正在尝试使用 Windows Media Foundation 类解码 mp4 视频并将帧转换为 DirectX 着色器可用于渲染的 2D 纹理。我已经能够使用 MFCreateSourceReaderfromURL 读取源流,并且能够读取其主要类型 MFMEdiaType_Video 和次要类型为 的流的媒体类型MFVideoFormat_H264 符合预期。

我现在需要将此格式转换为 RGB 格式,可用于初始化 D3D11_TEXTURE2D 资源和资源 View ,然后将其传递给 HLSL 像素着色器进行采样。我已经厌倦了使用 IMFTransform 类为我进行转换,但是当我尝试将转换的输出类型设置为任何 MFVideoFormat_RGB 变体时,我收到错误消息。我还尝试在源阅读器上设置一个新的输出类型,然后只是希望获得正确格式的样本的采样,但我又一次没有运气。

所以我的问题是:

  • 这种类型的转换是否可能?

  • 这可以通过 IMFTransform/SourceReader 类来完成吗?我是否只需要调整代码,或者我是否需要手动进行这种类型的转换?

  • 这是将视频纹理数据馈送到着色器进行采样的最佳方式,还是有我没有想到的更简单的替代方法。

正在使用的操作系统是 Windows 7,所以我不能使用 SourceReaderEx 或 ID3D11VideoDevice 接口(interface),因为据我所知,这些解决方案似乎只能在 Windows 8 上使用。

任何正确方向的帮助/指针将不胜感激,如有必要,我也可以提供一些源代码。

最佳答案

Is this type of conversion possible?

是的,这是可能的。现货H.264 Video Decoder MFT 是“Direct3D 感知的”,这意味着它可以利用 DXVA 将视频解码为 Direct3D 9 表面/Direct3D 11 纹理。或者,如果硬件功能不足,也可以使用软件回退模式。出于性能原因,您有兴趣将输出直接传送到纹理中(否则您将不得不自己加载此数据,并为此花费 CPU 和视频资源)。

Can this be done through the IMFTransform/SourceReader classes like I've tired above and do I just need to tweak the code or do I need to do this type of conversion manually?

IMFTransform 是抽象接口(interface)。它由 H.264 解码器(以及其他 MFT)实现,您可以直接使用它,或者您可以使用更高级别的 Source Reader API 来使用此 MFT 管理文件中的视频读取和解码。

也就是说,MFT 和 Source Reader 实际上并不是排他性的备选方案,而是一个更高和更低级别的 API。 MFT 接口(interface)由解码器提供,您负责输入 H.264 并排出解码输出。 Source Reader 管理相同的 MFT 并添加文件读取功能。

Source Reader本身在 Windows 7 中可用,顺便说一句(即使在 Vista 上,与较新的操作系统相比,功能集也可能受到限制)。

关于video - Windows Media Foundation 使用 IMFTransform 将 mp4 电影帧解码为 2D 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37461426/

相关文章:

video - ffmpeg幻灯片无法正常工作

ffmpeg - 在 ffmpeg 中进行后处理以在 MP4 文件中移动 'moov atom' (qt-faststart)

ffmpeg - 如何在没有很长启动时间的情况下通过 HTTP 流式传输很长的 H.264 视频? (或 : MOOV atom too large)

windows-7 - 是否可以在 Windows 7 上同时安装 32 位和 64 位 Java?

android - 此 Android SDK 需要 Android Developer Toolkit 版本 22.0.0 或更高版本。当前版本是 21.x.x。

python - Windows 上的多处理无限循环(Python)

视频无法在 Quicktime 中播放

video - 如何使用 FFMPEG 分割视频以便每个 block 都以关键帧开始?

html - 跨浏览器兼容的内联视频解决方案

android - 无法在 TextureView Android 中播放视频