我目前正在尝试通过命令行screenrecord实用程序来记录Surface.根据实现,该框架将视频编码器组件的颜色格式设置为OMX_COLOR_FormatAndroidOpaque.因此,视频编码器*从gralloc句柄中检索颜色格式.
执行此用例时,视频编码器遇到了BGRA表面.因此,我要寻找的问题是:
如果是Miracast,则通过SurfaceMediaSource接收编码器的输入.在进行Surface记录的情况下,MediaCodec的输入表面是通过GraphicBufferSource接口提供的.
应该从视频编码器内部处理从RGB到YUV空间的颜色转换,还是最好在SurfaceMediaSource中引入它是gralloc源的编码器源抽象?
解决方法:
对于我的问题,我调查了作为AOSP分发一部分而公开的编解码器,并发现排名前三的供应商,即高通,三星和TI,都采用了内部颜色转换来处理Surface录制场景.一些有用的链接如下:
高通公司基于V4L2的编解码器实现:
> Handling of RGBA_8888
buffers in omx_video_base
component.
在Qualcomm视频触摸屏中,对于Surface记录,存在颜色转换,因此实际的YUV数据存在于缓冲区指针中.从此note可以看出,在这种情况下,即在地面记录和带有Gralloc源的Camera情况之间,处理方式有所不同.
TI的视频编码器:
> H.264
Encoder opening a color conversion module for OMX_COLOR_FormatAndroidOpaque
.
> H.264
Encoder: Conversion from Platform Opaque to NV12
format.
> MPEG-4
Video Encoder: Opening of color conversion module for Opaque color format.
三星视频编码器:
> ARGB8888
conversion to YUV420SemiPlanar
.
就三星而言,从Exynos_OSAL_GetInfoFromMetaData
可以看出,gralloc源场景之间没有区别.