我目前正在尝试通过命令行 screenrecord
实用程序录制 Surface
。根据实现,框架将 video encoder
组件的颜色格式设置为 OMX_COLOR_FormatAndroidOpaque
。因此,视频编码器
被迫从gralloc
句柄中检索颜色格式。
执行此用例时,视频编码器
遇到BGRA
Surface
。因此,我试图找到答案的问题是:
在 Miracast 的情况下,编码器的输入是通过 SurfaceMediaSource
接收的。在 Surface
记录的情况下,MediaCodec
的输入表面是通过 GraphicBufferSource
接口(interface)提供的。
从 RGB
到 YUV
空间的颜色转换应该在 video encoder
内部处理还是在 SurfaceMediaSource 中引入更好
哪个是 gralloc
源的编码器源抽象?
最佳答案
关于我的问题,我调查了作为 AOSP
分发的一部分公开的编解码器,发现前 3 名供应商,即高通、三星和 TI 采用了内部颜色转换来处理Surface
录制场景。一些有用的链接如下:
高通基于 V4L2
的编解码器实现:
在 Qualcomm 视频编码器中,对于 Surface
记录,存在颜色转换,因此,实际的 YUV
数据存在于缓冲区指针中。从这个 note 中可以看出,这种场景的处理存在差异,即 Surface
记录和带有 Gralloc
源的 Camera
场景。 .
TI 的视频编码器:
H.264
Encoder opening a color conversion module forOMX_COLOR_FormatAndroidOpaque
.H.264
Encoder: Conversion from Platform Opaque toNV12
format .MPEG-4
Video Encoder: Opening of color conversion module for Opaque color format .
三星视频编码器:
在三星的案例中,gralloc
源场景之间没有区别,这可以从 Exynos_OSAL_GetInfoFromMetaData
中观察到。 .
关于android - 表面记录 : Color Format Issues,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23233138/