在探究该问题前,先来了解一下 MediaCodec
的两种编码模式:
ByteBuffer 模式
(手动档):- 格式:
COLOR_FORMAT
对应的值是MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar
(图像格式 NV21)。 - 操作:通过
MediaCodec.dequeueInputBuffer()
获取数据输入缓冲区,再通过MediaCodec.queueInputBuffer()
手动将 YUV 图像传给MediaCodec
。 Surface 模式
(自动档):- 格式:
COLOR_FORMAT
对应的值是MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface
。 - 操作:通过
MediaCodec.createInputSurface()
创建编码数据源 Surface,再通过 OpenGL 纹理,将相机预览图像绘制到该 Surface 上。
1、现象
相机预览正常,但是录制出来的 mp4 视频颜色很阴间。
说明:就跟 YUV 图像把 u/v 颠倒之后的效果一样。
2、分析
ByteBuffer 模式
下,从相机处获取到原始的 NV21 图像