我正在看一看视频编码的大片段示例,即:http://bigflake.com/mediacodec/encodeandmuxtest.java.txt我想知道这个方法是否比仅仅从cameracallback对象本身使用onpreviewframe方法来检索图像的原始字节并将它们提供给编码器要快。如果是这样的话,那么谁能向我解释一下为什么速度更快?
mkh04yzy1#
是和否,取决于你做什么。如果从相机预览回调中获取原始字节,则需要将像素数据从媒体服务器进程传递到应用程序的进程中,然后从应用程序返回到媒体服务器进程中,再传递到编码器中。像素数据一直以yuv格式保存,但您的应用程序可能需要将其从一个yuv布局转换为另一个(编码器可以接受几种不同格式的像素数据,这些格式不一定与相机在公共api中提供的格式相同)。如果您通过egl/opengl将帧从相机传递到编码器,那么实际的像素数据就不需要传递到进程中,而是保存在不透明的表面中,所有格式转换都由图形硬件处理。一方面,这涉及到在通过opengl时将来自相机的yuv的像素数据转换成rgb,在进入编码器时将其转换回yuv,但是所有这些都被抽象掉了。因此,根据相机驱动程序和egl/opengl驱动程序的优化质量和数量,这种方法可能同样快或更快。特别是如果您想对图像数据进行某种处理,如果可以在gl着色器中进行处理。相机预览回调方法看起来可能更简单,但实际上它在将数据传递到应用程序进程时有相当大的固有开销。
1条答案
按热度按时间mkh04yzy1#
是和否,取决于你做什么。
如果从相机预览回调中获取原始字节,则需要将像素数据从媒体服务器进程传递到应用程序的进程中,然后从应用程序返回到媒体服务器进程中,再传递到编码器中。像素数据一直以yuv格式保存,但您的应用程序可能需要将其从一个yuv布局转换为另一个(编码器可以接受几种不同格式的像素数据,这些格式不一定与相机在公共api中提供的格式相同)。
如果您通过egl/opengl将帧从相机传递到编码器,那么实际的像素数据就不需要传递到进程中,而是保存在不透明的表面中,所有格式转换都由图形硬件处理。一方面,这涉及到在通过opengl时将来自相机的yuv的像素数据转换成rgb,在进入编码器时将其转换回yuv,但是所有这些都被抽象掉了。
因此,根据相机驱动程序和egl/opengl驱动程序的优化质量和数量,这种方法可能同样快或更快。特别是如果您想对图像数据进行某种处理,如果可以在gl着色器中进行处理。相机预览回调方法看起来可能更简单,但实际上它在将数据传递到应用程序进程时有相当大的固有开销。