2016-06-07 24 views
2

我需要記錄一個只包含一個單幀的視頻:用戶指定的圖像(可以是任意長度,但只有相同的靜態圖像)。所以,我想我可以使用新的MediaRecorder.VideoSource.SURFACE,並畫到記錄器正在使用的Surface。我正確初始化了記錄器,我甚至可以調用MediaRecorder.getSurface()而不會出現異常(這顯然非常棘手)。需要繪製到MediaRecorder使用的表面

我的問題有點尷尬:我不知道如何處理返回的表面。我需要以某種方式繪製它,但是我可以找到的所有示例都涉及繪製到SurfaceView。這個表面是否與MediaRecorder.setPreviewDisplay()使用的表面相同?我如何繪製一些東西?

回答

0

理論上講,如果你想用軟件渲染,你可以使用Surface#lockCanvas()來獲得一個畫布。在某些平臺上曾經有problems with this;不知道這是否已經修復。

另一種選擇是從Surface創建一個EGLSurface並用OpenGL ES渲染它。你可以在Grafika找到這個例子,用一些代碼來管理所有的EGL設置。

GLES錄製示例使用MediaCodec而不是MediaRecorder,但想法相同,MediaRecorder應該更簡單。

+0

我剛剛嘗試過:錄製開始後,我調用了lockCavas(),在畫布上畫了一條線,然後調用了unlockAndPostCanvas()。但是,當我停止錄製時,出現RuntimeException,根據文檔意味着沒有收到有效數據用於錄製。我沒有遇到像發佈的鏈接那樣的錯誤顏色偏移問題。有任何想法嗎? –

+0

色彩通道逆轉是一種可能的結果;徹底的失敗是另一回事。聽起來你需要去GLES路線。 (可以使用軟件渲染來創建離屏位圖,使用'glTexImage2D()'將紋理作爲紋理上傳,然後渲染該紋理...因此不需要將所有渲染轉換爲GLES命令。 )如果您從Grafika中的代碼開始,只用'glClear()'和剪刀矩形在屏幕上繪製彩色矩形,則應該可以測試出來,而不用將腳趾浸入GLES中。 – fadden

相關問題