我想将视频文件的内容解码为Direct3D11纹理,并避免副本来回CPU内存。理想情况下,只要视频帧被解码,图书馆就会自己播放音频并回调我的代码。
从表面上看,Windows Media Foundation的IMFPMediaPlayer(即MFPCreateMediaPlayer()和IMFPMediaPlayer :: CreateMediaItemFromURL())似乎是一个很好的匹配,除了玩家直接解码到应用程序的HWND。该文档暗示我可以添加自定义视频接收器,但我无法找到文档或示例代码如何执行此操作。请指出我正确的方向。
目前,我使用libVLC来完成上述操作,但它只提供CPU内存中的视频表面,这可能成为我的用例的瓶颈。
谢谢。
看看我的项目'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本身并不处理所有视频格式。