天天看點

【分享】性能比肩美拍秒拍的Android視訊錄制編輯特效解決方案【2】

上一篇文章是初步接觸Andorid多媒體開發時,以使用純開源的方式實作的基礎效果,效率上有很大問題。經過半年多的繼續學習,解決了其中部分有效率問題的地方。

(1)編解碼部分

編解碼部分之前文章采用的X264+FFMPEG的開源方案,而繼續學習之後,找到了android上特有的實作方案。

版本<4.4:x264+ffmpeg  or 私有API(libstagefright.so)。

版本=4.4:jni反調android.media.MediaCodec or 或者在java層開發。

版本>4.4:NdkMediaCodec(android.media.MediaCodec 的 jni接口)。

(2)AAC更優開源方案

AAC開源方案FDKAAC一直在更新,效率有提升,而faac早就不更新了。so...你懂的。

AAC也可以使用MediaCodec或者NdkMediaCodec

(3)OpenGL之framebuffer資料的回讀

GLES版本<3.0:使用glReadPixels 或者 EGLImageKHR(eglCreateImageKHR,glEGLImageTargetTexture2DOES)

GLES版本=3.0:Pixel Pack Buffer + glMapBufferRange。

Android版本>=4.2:還有一個android平台化的回讀FrameBuffer的方案,那就是建立SurfaceTexture和Surface,然後新建立一個OpenGL Context,一比一再渲染一次,即可将FrameBuffer渲染到這個SurfaceTexture上面,surface還可以作為編碼器的輸入。這樣不僅可以快速從渲染結果傳遞資料到編碼器,還能實作跨線程傳遞紋理資料,屬于android平台本身提供的功能,非opengl自帶能力。之是以是4.2,是因為SurfaceTexture在4.2以後才基本完善,之前各種不穩定。