2016-02-25 15 views
2

我想了解如何使用MediaCodec處理Surface-to-Surface方法。在僅有ByteBuffer的方法中,解碼數據被放置在OutputBuffers中。這個非編碼數據可以手動處理,然後傳遞給Encoder的InputBuffers。解碼器的輸出表面如何傳遞到編碼器的輸入表面?

如果我們看一下Android MediaCodec CTS中使用表面到曲面方法在解碼器和編碼器之間傳遞數據的示例,我們將解碼器配置爲將解碼數據輸出到名爲outputSurface的Surface上,然後配置編碼器接收Surface上稱爲inputSurface的數據。

在本文檔中,createInputSurface和該表面在編碼器的結構的使用被描述爲這樣:

createInputSurface():請求一個表面作爲輸入使用的編碼器,在輸入緩衝區的位置。

換句話說,這在ByteBuffers聲明中的CTS示例中是可見的:編碼器沒有InputBuffers。您有:

  • DecoderInputBuffers(從MediaExtractor接收視頻軌道樣本)
  • DecoderOutputBuffers(輸出到解碼拉YUV幀)
  • 沒有。 (嗯...輸入表面。)
  • EncoderOutputBuffers(輸出摳重新編碼的東西傳遞給複用器)

相反enqueu-ING數據的編碼器InputBuffers,你有這些線代碼:

解碼器的ouputSurface內容如何傳遞到編碼器的inputSurface?幕布背後究竟發生了什麼?

+1

從這裏開始:https://source.android.com/devices/graphics/architecture.html – fadden

回答

1

解碼器的/編碼器的輸出/分別輸入Surface專門配置(或者物理連續保留等)片的存儲器,它專門硬件(例如,GPUs,硬件(加速)編解碼器)或軟件模塊可以以最適合性能需求的方式使用(通過使用硬件加速,DMA等功能)。

更具體地,在例如在當前上下文中,解碼器的輸出表面被SurfaceTexture支持,所以它可以在一個OpenGL environment被用作外部紋理任何種類的處理的使用,以便在渲染之前在編碼器可以讀取和編碼的表面上創建最終的視頻幀。

不巧的是,OpenGL只能渲染到這樣一個Surface

所以解碼器用作原始視頻幀的提供商,所述表面(紋理)載體的OpenGL介質到它呈現給編碼器的輸入表面這是目的地(待編碼)視頻幀。

爲了進一步滿足您的好奇心,請查詢Editing frames and encoding with MediaCodec瞭解更多詳情。

[編輯]

可以在grafikaContinuous CameraShow + capture camera,其目前呈現相機幀(饋送到表面紋理),以一個視頻(和顯示)檢查子項目。所以基本上,唯一的變化是MediaCodec將幀提供給SurfaceTexture而不是Camera。

谷歌CTS DecodeEditEncodeTest完全相同,可以作爲參考,以使學習曲線更平滑。

要從基礎做起,爲法登指出使用Android graphics tutorials

+0

哇,謝謝!但輸入表面的確切位置與解碼器表面連接的位置?通過EglContext? –

+1

你到底需要做什麼?可以渲染解碼爲Surface紋理的幀(如果需要通過OpenGL以任何方式進行操作)。Plz check更新回答 –

+0

事實上,這並不是我想要實現的東西,我經歷了大部分現有的文檔和測試,並開發了一個(Xamarin.Android),但我想要的是能夠「解釋」它的工作原理,爲什麼兩個表面都可以進行通信,看起來Fadden的鏈接正是我需要閱讀的內容, –

相關問題