背景

在使用MediaCodec解码时可能出现如ACodec: [OMX.IMG.MSVDX.Decoder.AVC] using color format 0x15 in place of 0x7f420888,实际解码的颜色格式与指定的颜色格式不一致;以及在使用ImageReader时出现ImageReader_imageSetup: Overriding buffer format YUV_420_888 to 32315659,实际的图片颜色格式与指定的颜色格式不一样。

出现这两种情况都是正常的,而且在大部分情况下是必须的。

原因分析

MediaCodec

首先来说using color format 0x15 in place of 0x7f420888,这个的意思是解码前给解码器设定的颜色格式是0x7f420888,但实际解码时颜色格式被自动替换成了0x15

0x7f420888是在MediaCodecInfo.CodecCapabilities中定义的,代表的颜色格式是COLOR_FormatYUV420Flexible而这种颜色格式从来都不是一个确定的格式,只是代表YUV420这一类格式。从官方文档中可以看到,COLOR_FormatYUV420Flexible可以代表的颜色格式包括:COLOR_FormatYUV411PlanarCOLOR_FormatYUV411PackedPlanarCOLOR_FormatYUV420PlanarCOLOR_FormatYUV420PackedPlanarCOLOR_FormatYUV420SemiPlanar以及COLOR_FormatYUV420PackedSemiPlanar

当在MediaCodec解码器中指定颜色格式为COLOR_FormatYUV420Flexible,实际上是在解码时由解码器在COLOR_FormatYUV420Flexible包括的格式中,选择一种支持的格式进行解码,同时会在日志中记下这个过程。所以说出现这个提示是正常的,你指定需要解码为COLOR_FormatYUV420Flexible颜色格式,实际解码后给你的也是COLOR_FormatYUV420Flexible格式。

ImageReader

Overriding buffer format YUV_420_888 to 32315659也是同样的道理,意思是指定ImageReader接收Image的颜色格式为YUV_420_888,但实际Image的颜色格式为32315659

YUV_420_888是在ImageFormat中定义的,代表YUV420这类格式,其中每个颜色分量都是8bit。而32315659则代表YV12,同样是YUV420格式中的一种;实际上还有NV21NV16等也属于YUV420这类格式。

当在ImageReader中指定颜色格式为YUV_420_888时,实际只要颜色格式属于YUV420ImageImageReader都会接收,同时会在日志中记下这个正常的颜色格式不一致。所以说出现这个提示也是正常的,你指定ImageReader接收YUV_420_888,实际接收到的Image也是YUV_420_888格式。

获取具体颜色格式?

想必有人还是会想要知道具体的颜色格式,而不仅仅是一条日志。就像日志出现了using color format 0x15 in place of 0x7f420888,能不能用代码获取到现在的颜色格式已经是0x15了呢?很抱歉,就我目前所知,是不能获取到的。

甚至,当你能看到这个日志记录时,说你你已经用上API 21了,而我上面说到的具体的颜色格式,其中绝大多数在API 21已经deprecated掉了;也就是说我们不用太指望还会有Android方法能够应用这些具体的颜色格式。

我的建议是,你可以好好看看Image类,并且试着去用Image类,不要再纠结于过于具体的颜色格式。

参考