>我目前正在尝试通过命令行screenrecord
实用程序记录Surface
。根据实现,框架将video encoder
组件的颜色格式设置为 OMX_COLOR_FormatAndroidOpaque
。因此,video encoder
被迫从gralloc
句柄检索颜色格式。
执行此用例时,video encoder
遇到BGRA
Surface
。因此,我试图找到答案的问题是:
在 Miracast 的情况下,编码器的输入是通过 SurfaceMediaSource
接收的。在Surface
记录的情况下,MediaCodec
的输入表面通过GraphicBufferSource
接口提供。
从RGB
到YUV
空间的颜色转换应该在video encoder
内处理,还是最好在SurfaceMediaSource
中引入编码器对gralloc
源的源抽象?
进一步回答我的问题,我调查了作为AOSP
发行版的一部分公开的编解码器,发现前 3 名供应商(即高通、三星和 TI(已采用内部颜色转换来处理Surface
录制场景。一些有用的链接如下:
高通公司基于V4L2
的编解码器实现:
- 处理组件
omx_video_base
RGBA_8888
缓冲区。
在高通视频节点中,对于Surface
记录,存在颜色转换,因此,实际YUV
数据存在于缓冲区指针中。这种情况在处理上存在差异,即 从本说明中可以观察到Surface
记录和Camera
具有Gralloc
源的场景。
TI 的视频编码器:
-
H.264
编码器打开颜色转换模块进行OMX_COLOR_FormatAndroidOpaque
。 -
H.264
编码器:从平台不透明转换为NV12
格式。 -
MPEG-4
视频编码器:打开不透明颜色格式的颜色转换模块。
三星视频编码器:
-
ARGB8888
转换为YUV420SemiPlanar
。
在三星的案例中,从Exynos_OSAL_GetInfoFromMetaData
中可以观察到gralloc
源场景之间没有区别。