1.請參考以下鏈接,首先了解YUV420P,YUV420SP,NV21,YV12這些基本的顏色格式
YUV格式詳解 http://blog.csdn.net/SearchSun/article/details/2443867
圖文詳解YUV420數據格式 http://blog.csdn.net/a656343072/article/details/9979347
android CodecCapabilities 圖像格式 http://www.2cto.com/kf/201403/287429.html
android CodecCapabilities 圖像格式 http://blog.csdn.net/jumper511/article/details/21719313
2.基本配置
m_camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
Camera.Parameters parameters = m_camera.getParameters();
parameters.setPreviewSize(width, height);
parameters.setPictureSize(width, height);
//預覽格式決定預覽回調裏的數據格式,5.0以下通常有2種 NV21和 YV12
parameters.setPreviewFormat(ImageFormat.NV21);
3.根據以上格式,我們知道我們預覽格式如何轉換以適應MediaCodec編碼的需要
1>.如果我們預覽格式設置爲NV21,我們知道NV21的數據格式爲2個planar,也就是兩個平面,第一個平面是所有的Y分量,而第二個平面是V和U交錯平面,並且是V在U前 ,在字節數組中是這樣的結構: YYYYYYYY VUVU
2>.如果預覽數據格式設置爲YV12,我們知道YV12爲3個平面,第一個平面是所有的Y,第二個平面爲所有的V,第三個平面爲所有的U,在字節數組中是這樣的結構: YYYYYYYY VV UU
3>. Android COLOR_FormatYUV420Planar 即YUV420P,也就是說它要求的傳給編碼器的數據格式爲: YYYYYYYY UU VV
4>.Android COLOR_FormatYUV420SemiPlanar 即YUV420SP,它要求傳給編碼器的數據格式爲: YYYYYYYY UVUV
★.如果預覽格式設置爲NV21,那麼在MediaCodec中設置編碼格式,如果編碼器支持顏色格式COLOR_FormatYUV420SemiPlanar,這兩個格式都是半平面也就 是有兩個平面,第一個平面是所有的Y分量,第二個平面NV21爲VUVU,而 COLOR_FormatYUV420SemiPlanar 爲UVUV,也就是說如果預覽格式爲NV21,編碼顏色格式爲COLOR_FormatYUV420SemiPlanar,我們在預覽數據需要給編碼器編碼的時候,需要轉換NV21第二個平面裏V和U的位置:
NV21(yyyyyyyy vuvu) ----------> COLOR_FormatYUV420SemiPlanar (yyyyyyyy uvuv)
這樣編碼才能編碼出正確的顏色
★.如果預覽格式設置爲YV12,編碼器顏色格式 COLOR_FormatYUV420Planar,這兩個格式都是平面模式,都包含三個平面,第一個平面都是所有的分量Y, YV12的第二個平面爲所有的分量V,第三個平面爲所有分量U,而YUV420P的第二個平面爲所有分量U,第三個平面爲所有分量V.所有如果我們採用的YV12預覽,編碼器顏色格式爲 COLOR_FormatYUV420Planar,我們需要交換預覽數據裏YV12的第二個平面V和第三個平面U的位置:
YV12(yyyyyyyy vv uu) ----------> COLOR_FormatYUV420Planar (yyyyyyyy uu vv)
★.以上僅適用與Android4.4及以下,Android 5.0及以上有新的顏色格式,請使用新的API 顏色格式,將不會那麼麻煩。