2016-01-21 105 views
0

我能夠解碼mp4視頻。如果我使用Surface配置解碼器,我可以在屏幕上看到視頻。現在,我想編輯框架(添加一條黃線,甚至更好地重疊一個小圖像),並將視頻編碼爲新視頻。沒有必要顯示視頻,我現在也不關心它的性能(如果我在編輯時顯示幀,如果編輯功能需要很長時間,我可能會有差距),那麼,您建議我用glSurface配置解碼器,然後使用OpenGl(GLES),或者將它配置爲null,並以某種方式將Bytebuffer轉換爲Bitmap,修改它,並將位圖編碼爲字節數組?我還在Grafika頁面看到,您使用自定義Rederer的Surface,並使用OpenGl(GLES)。謝謝使用MediaCodec編輯幀和編碼

回答

3

您將不得不使用OpenGLES。 ByteBuffer/Bitmap方法不能提供真實的性能/功能。

現在你已經能夠(使用MediaExtractor和編解碼器)視頻解碼爲Surface,你需要使用用於創建表面的External Texture和渲染使用GLES從MediaCodec檢索另一個Surface配置SurfaceTexture作爲編碼器。

雖然Grafika沒有一個完全相似的完整的項目,你可以用你現有的項目啓動,然後嘗試使用以下子項目的grafika Continuous CameraShow + capture camera,目前呈現Camera幀(輸送到表面紋理)到一個視頻(和顯示器)。 因此,本質上,唯一的變化是MediaCodec餵養框到SurfaceTexture而不是Camera

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

使用這種方法,您當然可以做各種各樣的事情,如操縱視頻的播放速度(快進和慢放),在場景中添加各種疊加層,使用視頻中的顏色/像素進行播放着色器等。

結帳過濾器Show + capture camera爲了說明相同。

解碼 - 編輯編碼流

當使用OpenGLES,幀的「編輯」經由使用GLES到編碼器的輸入面繪製發生。

如果在不同的線程中分離出解碼和渲染+編碼,那麼除非在兩個線程之間實現某種同步以保持解碼器等待渲染+編碼,否則必然會在每幀中跳過幾幀該框架發生在另一個線程上。

雖然現代硬件編解碼器支持同步視頻編碼和解碼,但我建議,do the decoding, rendering and encoding in the same thread,尤其是在您的情況下,當時性能不是一個主要問題。這將有助於避免必須處理自己的和/或跳轉幀的同步問題。

+0

謝謝!我以前看過這些例子,我想我應該實現SurfaceTexture.OnFrameAvailableListener,但是如果我的frame-Edit函數花費很多時間,恐怕會丟失一些幀。正如我所問,我的想法是像批處理一樣執行,而不是顯示我正在解碼的內容 - 編輯 - 編碼。我想在同一個線程中進行解碼和編碼後進行編輯,而不是像捕捉相機那樣捕獲幀。 –

+1

請檢查更新後的答案。我在解碼 - 編輯 - 編碼流程中增加了一些細節。 –