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

问题描述 投票:0回答:1

我想将视频文件的内容解码为Direct3D11纹理,并避免副本来回CPU内存。理想情况下,只要视频帧被解码,图书馆就会自己播放音频并回调我的代码。

从表面上看,Windows Media Foundation的IMFPMediaPlayer(即MFPCreateMediaPlayer()和IMFPMediaPlayer :: CreateMediaItemFromURL())似乎是一个很好的匹配,除了玩家直接解码到应用程序的HWND。该文档暗示我可以添加自定义视频接收器,但我无法找到文档或示例代码如何执行此操作。请指出我正确的方向。

目前,我使用libVLC来完成上述操作,但它只提供CPU内存中的视频表面,这可能成为我的用例的瓶颈。

谢谢。

c++ windows ms-media-foundation
1个回答
0
投票

看看我的项目'Stackoverflow'中的源代码:MFVideoEVR

该程序展示了如何使用源阅读器设置EVR(增强视频渲染器)以及如何为其提供视频样本。

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

该程序通过IMFVideoSampleAllocator提供样本。它适用于DirectX9纹理。您需要更改源代码,并使用IMFVideoSampleAllocatorEx,而不是:IMFVideoSampleAllocatorEx

关于MFCreateVideoSampleAllocatorEx:

此函数为DXGI视频表面创建分配器。此分配器创建的缓冲区公开IMFDXGIBuffer接口。

所以要检索纹理:qazxsw poi

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

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

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

PS:你不谈论视频格式(h 265,h264,mpeg 2,其他??)。 Media Foundation本身并不处理所有视频格式。

© www.soinside.com 2019 - 2024. All rights reserved.