[英]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.