通过OpenGL进行Android相机编码

时间:2017-01-03 17:07:01

标签: java android opengl-es mediacodec

我正在研究视频编码的BigFlake示例,即这一个:

http://bigflake.com/mediacodec/EncodeAndMuxTest.java.txt

我想知道这个方法是否基本上比使用CameraCallback对象本身的onPreviewFrame方法更快,以检索图像的原始字节并将它们提供给编码器。

如果是这种情况,那么有人可以向我解释为什么这会更快?

1 个答案:

答案 0 :(得分:1)

是和否,取决于你做了什么。

如果从相机预览回调中获取原始字节,则需要将像素数据从媒体服务器进程传递到应用程序的进程,并从应用程序返回到媒体服务器进程到编码器。像素数据一直保持为YUV格式,但您的应用可能需要将其从一个YUV布局转换为另一个(编码器可以接受几种不同格式的像素数据,这些格式不一定与相机提供公共API)。

如果您通过EGL / OpenGL将帧从相机传递到编码器,实际的像素数据永远不需要传递到您的过程中,而是保存在不透明的表面中,其中所有格式转换都由图形硬件处理。这一方面一方面涉及在通过OpenGL时将来自相机的YUV的像素数据转换为RGB,然后在转到编码器时转换回YUV,但所有这些都被抽象掉了。

因此,根据相机驱动程序和EGL / OpenGL驱动程序所花费的优化质量和数量,这种方法可能会更快或更快。特别是如果你想对图像数据进行某种处理,如果它可以在GL着色器中完成。相机预览回调方法可能看起来更简单,但实际上在将数据传递到应用程序的过程中会产生相当多的固有开销。