2015-02-11 38 views
5

目標是實現用於視頻處理和同步到外部應用程序的自定義MFT。細節並不重要。 我想要實現的第一步是使用DXVA視頻處理或DXVA-HD啓動並運行MFT。我無法這樣做。使用DirectX視頻加速(DXVA)實現媒體基礎變換(MFT)

以下是我所做的: 我開始構建一個包含源輸入節點(我的攝像頭),MFT(MFT_Grayscale示例)和EVR的拓撲。 我把它包含在一個小應用程序中。拓撲工作,我可以看到來自相機的單色流。 現在我想更改MF_Grayscale示例的代碼,以便它支持DXVA視頻處理,並且可以使用VideoProcessBlt方法提供的硬件加速。 微軟文檔提供了一些信息,但我無法實現正在運行的MFT。

我做了什麼至今:

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進行代碼示例,我也會很感激。我是不是能找到什麼...

感謝

回答

0

得到媒體基金會樣品的最簡單方法是下載和http://www.microsoft.com/en-us/download/details.aspx?id=8279「適用於Windows 7和.NET Framework 4的Microsoft Windows SDK」安裝。安裝示例,然後在'v7.1/Samples/Multimedia/MediaFoundation'找到它們。 媒體基金會的樣本應該在微軟的代碼庫網站上,但我一直無法找到它們。這些示例不再包含在Windows SDK版本中。

與您的問題直接相關的示例可能是解碼器,DXVA_HD,DXVA2_VideoProc,EVRPresenter,MPEG1Source和topoedit。

我無法提供任何幫助,因爲我目前正在努力解決一些相同的問題。

+0

請不要回答詢問非現場推薦或鏈接的問題。你已經提出了一個解決方案,而不使用一個好的鏈接。這些請求是無關緊要的,這個問題將被關閉,或者該部分將被編輯出來。 – 2015-04-04 23:31:16

1

我是否需要修改GetOutputAvailableType/SetOutputType方法?

是的。您需要像往常一樣提供屬性,而無需特殊要求。

我需要將緩衝區的數據memcpy到Direct3D表面嗎?

是的。這樣做時,您需要關心IDirect3DDeviceManager9和LockDevice,因爲EVR可以同時使用表面。

如何確定表面是否在使用中?

特別是當表面可以自由使用時,您必須特別小心。你的MFT需要實現IMFAsyncCallback接口。使用MFCreateVideoSampleFromSurface後,您將查詢IMFTrackedSample接口並調用SetAllocator。 Invoke方法會告訴你表面何時空閒。

我該如何輸出表面?我應該使用MFCreateVideoSampleFromSurface還是MFCreateDXSurfaceBuffer?

因爲您使用的是IDirectXVideoProcessorService-> CreateSurface,MFCreateVideoSampleFromSurface是正確的地方。你通過IMFSample輸出曲面。

檢查項目:

MFNode

在MFTDxva2Decoder和MFSkDxva2Renderer,你會發現一些DXVA2處理。