如何使用Windows Media Foundation直接将视频文件直接解码为Direct3D11纹理
How to decode a video file straight to a Direct3D11 texture using Windows Media Foundation?
我想将视频文件的内容解码为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并未处理所有视频格式。
- 如何在C++中解码OggOpus文件
- 有没有更好的方法来使用比特流解码文件格式?
- 如何将 WebM 文件解码为原始 PCM?
- 解码并保存 base64 C++中的图像文件
- 霍夫曼解码压缩文件
- 流文件Delta编码/解码
- 媒体基础多音频流文件解码错误
- 如何使用Windows Media Foundation直接将视频文件直接解码为Direct3D11纹理
- 超级强大-导出到文件与混合器和解码器问题(不同的sampleRates和samplesPerFrame)
- 位换档字符串以解码保存文件C
- 解码Microsoft True Type字体文件
- C++ 无法实例化编解码器以在 txt 文件中写入 unicode
- 跨平台UTF-8字符文件数据编码/解码
- 我加密但无法使用C++执行文件解码
- 通过将文件中的字符串的字符改变为另一特定字符来将文本文件解码为另一文本文件
- 如何解码一个动画gif文件在MFC2010
- 编译eAccelerator解码PHP编码文件
- 在c++中打开/解码Zork保存文件(Quetzal格式)
- 编写图像到视频文件独立安装编解码器
- 使用堆栈库解码/封装文本文件 - 无法C++对大文件进行编码