目標是實現用於視頻處理和同步到外部應用程序的自定義MFT。細節並不重要。 我想要實現的第一步是使用DXVA視頻處理或DXVA-HD啓動並運行MFT。我無法這樣做。使用DirectX視頻加速(DXVA)實現媒體基礎變換(MFT)
以下是我所做的: 我開始構建一個包含源輸入節點(我的攝像頭),MFT(MFT_Grayscale示例)和EVR的拓撲。 我把它包含在一個小應用程序中。拓撲工作,我可以看到來自相機的單色流。 現在我想更改MF_Grayscale示例的代碼,以便它支持DXVA視頻處理,並且可以使用VideoProcessBlt方法提供的硬件加速。 微軟文檔提供了一些信息,但我無法實現正在運行的MFT。
我做了什麼至今:
- 在該方法中
GetAttributes
我表明這是MFTMF_SA_D3D_AWARE
。 - 在方法
ProcessMessage
中,我處理消息MFT_MESSAGE_SET_D3D_MANAGER
以獲取設備句柄,IDirect3DDeviceManager9
和IDirectXVideoProcessorService
。 - 在
SetInputType
方法我在這裏使用描述 https://msdn.microsoft.com/en-us/library/windows/desktop/ms694235(v=vs.85).aspx 的方法來獲取DXVA2_VideoDesc結構 ,並按照本規範 https://msdn.microsoft.com/en-us/library/windows/desktop/cc307964(v=vs.85).aspx 創建的視頻處理設備。此外,我創建使用IDirectXVideoProcessorService->CreateSurface
- 在
GetOutputStreamInfo
的dwFlags
變量看起來像這樣的方法表面:
pStreamInfo->dwFlags = MFT_OUTPUT_STREAM_PROVIDES_SAMPLES | MFT_OUTPUT_STREAM_WHOLE_SAMPLES | MFT_OUTPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER | MFT_OUTPUT_STREAM_FIXED_SAMPLE_SIZE;
一切似乎是確定,直到這裏。現在我的問題(我很抱歉,我不能更具體):
我必須在
GetOutputAvailableType/SetOutputType
方法適應?在
ProcessInput
方法中,我得到IMFSample
並提取IMFMediaBuffer
。根據我的函數調用,緩衝區不管理IDirect3DSurface9
。 我是否需要將緩衝區的數據memcpy寫入Direct3D表面?在
ProcessOutput
方法作出的一個起點,我想轉發傳入的幀到輸出。VideoProcessBlt
應該從輸入到輸出產生1:1的比特。 該文檔說:獲取當前未使用的可用表面。
如何確定一個表面是否在使用?
我該如何輸出表面?我應該使用
MFCreateVideoSampleFromSurface
還是MFCreateDXSurfaceBuffer
?不幸的是我真的迷路了,無法使用文檔取得任何進展。
現在的情況是,我沒有看到任何視頻輸出(窗口具有其默認窗口的背景色)和網絡攝像頭停止捕獲第一幀之後的幀(該LED關閉)。除此之外沒有任何反應 - 應用程序只是繼續運行而不顯示任何內容)。
我希望有人能幫助我。如果有人能夠指導我使用DXVA視頻處理或DXVA-HD對MFT進行代碼示例,我也會很感激。我是不是能找到什麼...
感謝
請不要回答詢問非現場推薦或鏈接的問題。你已經提出了一個解決方案,而不使用一個好的鏈接。這些請求是無關緊要的,這個問題將被關閉,或者該部分將被編輯出來。 – 2015-04-04 23:31:16