轉(zhuǎn)載自:Penguin
背景
在使用MediaCodec解碼時可能出現(xiàn)如ACodec: [OMX.IMG.MSVDX.Decoder.AVC] using color format 0x15 in place of 0x7f420888,實際解碼的顏色格式與指定的顏色格式不一致;以及在使用ImageReader時出現(xiàn)ImageReader_imageSetup: Overriding buffer format YUV_420_888 to 32315659,實際的圖片顏色格式與指定的顏色格式不一樣。
出現(xiàn)這兩種情況都是正常的,而且在大部分情況下是必須的。
原因分析
MediaCodec
首先來說using color format 0x15 in place of 0x7f420888,這個的意思是解碼前給解碼器設(shè)定的顏色格式是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包括的格式中,選擇一種支持的格式進行解碼,同時會在日志中記下這個過程。所以說出現(xiàn)這個提示是正常的,你指定需要解碼為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都會接收,同時會在日志中記下這個正常的顏色格式不一致。所以說出現(xiàn)這個提示也是正常的,你指定ImageReader接收YUV_420_888,實際接收到的Image也是YUV_420_888格式。
獲取具體顏色格式?
想必有人還是會想要知道具體的顏色格式,而不僅僅是一條日志。就像日志出現(xiàn)了using color format 0x15 in place of 0x7f420888,能不能用代碼獲取到現(xiàn)在的顏色格式已經(jīng)是0x15了呢?很抱歉,就我目前所知,是不能獲取到的。
甚至,當你能看到這個日志記錄時,說你你已經(jīng)用上API 21了,而我上面說到的具體的顏色格式,其中絕大多數(shù)在API 21已經(jīng)deprecated掉了;也就是說我們不用太指望還會有Android方法能夠應(yīng)用這些具體的顏色格式。
我的建議是,你可以好好看看Image類,并且試著去用Image類,不要再糾結(jié)于過于具體的顏色格式。