我正嘗試使用MediaFoundation API對視頻進行編碼,但我遇到了將示例推送到SinkWriter的問題。使用Media Foundation對Direct X表面進行編碼
我正在通過Desktop Duplication API獲取要編碼的幀。我最終得到的是帶有桌面圖像的ID3D11Texture2D。
我試圖創建一個包含此表面的IMFVideoSample,然後將該視頻示例推送到SinkWriter。
我試着去了解這個以不同的方式:
我叫
MFCreateVideoSampleFromSurface(texture, &pSample)
其中質地的ID3D11Texture2D,填補了SampleTime和SampleDuration,然後通過創建樣品到SinkWriter。
SinkWriter返回了E_INVALIDARG。我嘗試通過傳遞nullptr作爲第一個參數並使用MFCreateDXGISurfaceBuffer自己創建緩衝區,然後將生成的緩衝區傳遞到Sample中來創建示例。
這也沒有工作。我閱讀了MediaFoundation文檔,找不到有關如何從DirectX紋理創建樣本的詳細信息。
我跑出來的東西嘗試。
有沒有人在那裏使用過這個API,並且可以想到我應該檢查的東西,或者我可以怎樣去調試這個東西?
我認爲你使用MFCreateVideoSampleFromSurface和MFCreateDXGISurfaceBuffer犯了一個錯誤。這些函數創建用於寫入DirectX和可視化表面的緩衝區,並使用接口「IMF2DBuffer」創建對象,但編碼器和編寫器需要具有「IMFMediaBuffer」的對象。他們無法理解'IMF2DBuffer'。嘗試使用函數'MFCreateSampleCopierMFT' - 它創建的MFT對象用於從[IMFMediaBuffer]複製到[MSDN]上的IMF2DBuffer(https://msdn.microsoft.com/en-us/library/windows/desktop/dd388101(v = vs.85)的.aspx)。可能是它可以做倒轉的工作!?! –
你確定嗎? 查看「MFCreateDXGISurfaceBuffer」的文檔,它指出它返回一個指向IMFMediaBuffer的指針。 –
您可以嘗試通過'MFCreateDXGISurfaceBuffer'中的'IMFMediaBuffer'緩衝區獲取數據。 –