转载自:Penguin
背景
在使用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_FormatYUV411Planar
,COLOR_FormatYUV411PackedPlanar
,COLOR_FormatYUV420Planar
,COLOR_FormatYUV420PackedPlanar
,COLOR_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
格式中的一种;实际上还有NV21
,NV16
等也属于YUV420
这类格式。
当在ImageReader
中指定颜色格式为YUV_420_888
时,实际只要颜色格式属于YUV420
的Image
,ImageReader
都会接收,同时会在日志中记下这个正常的颜色格式不一致。所以说出现这个提示也是正常的,你指定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
类,不要再纠结于过于具体的颜色格式。