簡體   English   中英

如何使用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(即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不能原生處理所有視頻格式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM