如何使用Windows Media Foundation直接将视频文件直接解码为Direct3D11纹理

How to decode a video file straight to a Direct3D11 texture using Windows Media Foundation?

本文关键字:解码 文件 Direct3D11 纹理 视频 Media Foundation 何使用 Windows      更新时间:2023-10-16

我想将视频文件的内容解码为Direct3D11纹理,并避免来回副本到CPU内存。理想情况下,图书馆将播放音频本身,并在解码视频框架时回到我的代码中。

在表面上,Windows Media Foundation的IMFPMediaPlayer(IE MfpCreateMediaPlayer()和ImfpMediaPlayer :: createMediaItemfromurl())看起来像是一个很好的匹配,只是玩家直接解码为应用程序的HWND。文档意味着我可以添加一个自定义的视频接收器,但是我无法找到有关如何执行此操作的文档或示例代码。请把我指向正确的方向。

目前,我正在使用libvlc来完成上述内容,但它仅在CPU内存中提供视频表面,这可以成为我用例的瓶颈。

谢谢。

从我的项目'stackoverflow'中查看此源代码:mfvideoevr

此程序显示了如何设置EVR(增强的视频渲染器),以及如何使用源读取器为其提供视频样本。

关键是提供视频样本,因此您可以将它们用于目的。

该程序通过Imfvideosampleallocator提供样品。它用于DirectX9纹理。您需要更改源代码,并使用Imfvideosampleallocatorex,而是:imfvideosampleallocatorex

关于mfcreatevideosampleallocatorex:

此功能为DXGI视频表面创建分配器。该分配器创建的缓冲区暴露了IMFDXGIBUFFER接口。

因此,要重新纹理:imfdxgibuffer :: getResource

您可以使用此方法获取指向表面的ID3D11TEXTURE2D接口。如果缓冲区被锁定,该方法返回MF_E_INVALIDREQUEST。

您还必须通过Imfsourcereader管理声音。

使用这种方法,没有复制回到系统内存。

ps:您不谈论视频格式(H265,H264,MPEG2,其他?)。MediaFoundation并未处理所有视频格式。