2012-02-06 60 views
2

我正在使用自定義視頻播放器。我在我的架構中使用了DirectShow/Media Foundation的混合。基本上,我使用DS抓取VOB幀(不受MF支持)。我能夠從DirectShow獲得一個示例,但我堅持將它傳遞給渲染器。在MF中,我得到一個Direct3DSurface9(來自IMFSample),並使用IDirect3D9Device將其呈現在後備緩衝器上。IMediaSample(DirectShow)到IDirect3DSurface9/IMFSample(MediaFoundation)

使用DirectShow,我得到IMediaSample作爲我的數據緩衝區對象。我不知道如何轉換並將其作爲IMFSample傳遞。我發現其他人從樣本中獲取位圖信息並使用GDI +進行渲染。但是我的視頻數據可能並不總是有RGB數據。我希望從IMediaSample獲得IDirect3DSurface9或IMFSample,並將其傳遞給渲染,在此我不必擔心顏色空間轉換。

我是新來的。如果我錯了,請糾正我。 謝謝

回答

3

IMediaSample你有來自上游解碼器的DirectShow不過是內存支持緩衝區的封裝。沒有,也不能有任何背後的表面(除非你自己照顧它,並提供一個自定義分配器,在這種情況下,你不會有第一個問題)。因此,您要將來自此緩衝區的數據複製到MF樣本緩衝區中。

您是否想要緩衝區格式(媒體類型)匹配,以便您可以在不轉換的情況下進行復制。其中一種方法 - 也許可能只有少數 - 是首先建立MF流水線,並找出在視頻硬件上使用緩衝區提供的像素類型。然後通過使用相應的抓取器初始化或顏色空間轉換濾鏡或通過色彩空間轉換DMO/MFT,確保您在DirectShow流水線中具有此像素格式和媒體類型。

+0

感謝您的回覆。假設我希望用我擁有的緩衝區數據填充D3D表面(在IMediaSample中),我該如何實現這一點?我無法使用抓取器方法獲取MF所需格式的樣本,因爲抓取器在渲染器之前不會連接,但總是處於未連接狀態,或者它將在解碼器之前連接。然後我採取了這裏描述的方法:http://www.codeproject.com/KB/audio-video/VideoImageGrabber.aspx我現在堅持如何將它複製到D3DSurface上。我嘗試了'memcpy',但是在渲染時看不到我的幀數據。 – 2012-02-07 10:59:51

+0

你必須想出一個合適的初始化順序,以確保格式匹配。或者,您也可以創建'DShow'和'MF'部件,分別限制某些已知格式,然後自己進行轉換,例如藉助「Color Converter DSP」http://msdn.microsoft.com/zh-cn/我們/庫/窗/臺式機/ ff819079%28V = vs.85%29.aspx – 2012-02-07 11:05:50

相關問題