Android 通过 OpenGL 进行相机编码

Android camera encoding through OpenGL

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

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

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

如果是这种情况,那么谁能向我解释为什么这样更快的原因?

是与否,取决于你做什么。

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

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

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