我想将视频文件的内容解码为Direct3D11纹理,并避免将副本来回传输到CPU内存。理想情况下,每当解码视频帧时,库都会播放音频本身并回调到我的代码中。
从表面上看,Windows Media Foundation的IMFPMediaPlayer(即MFPCreateMediaPlayer()和IMFPMediaPlayer :: CreateMediaItemFromURL())看起来很不错,只是播放器直接解码为应用的HWND。该文档暗示我可以添加一个自定义视频接收器,但是我无法找到文档或有关如何执行此操作的示例代码。请指出正确的方向。
当前,我正在使用libVLC来完成上述操作,但是它仅在CPU内存中提供视频表面,这可能成为我的用例的瓶颈。
谢谢。
答案 0 :(得分:0)
看看我的项目“ Stackoverflow”中的以下源代码:MFVideoEVR
该程序显示了如何使用源阅读器设置EVR(增强型视频渲染器)以及如何向其提供视频样本。
关键是提供视频样本,因此您可以根据需要使用它们。
该程序通过IMFVideoSampleAllocator提供样本。它用于DirectX9纹理。您需要更改源代码,并使用IMFVideoSampleAllocatorEx代替:IMFVideoSampleAllocatorEx
关于MFCreateVideoSampleAllocatorEx:
此函数为DXGI视频表面创建分配器。由该分配器创建的缓冲区公开了IMFDXGIBuffer接口。
所以要恢复纹理:IMFDXGIBuffer::GetResource
您可以使用此方法获取指向表面的ID3D11Texture2D接口的指针。如果缓冲区被锁定,则该方法返回MF_E_INVALIDREQUEST。
您还必须通过IMFSourceReader管理声音。
使用这种方法,不会将任何副本复制回系统内存。
PS:您没有在谈论视频格式(h265,h264,mpeg2等)。 MediaFoundation不能原生处理所有视频格式。