上一篇文章是初步接触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以后才基本完善,之前各种不稳定。