Android視頻採集編碼顏色格式選擇

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.基本配置


 

 

 

 
  1. m_camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);

  2. Camera.Parameters parameters = m_camera.getParameters();

  3. parameters.setPreviewSize(width, height);

  4. parameters.setPictureSize(width, height);

  5. //預覽格式決定預覽回調裏的數據格式,5.0以下通常有2種 NV21和 YV12

  6. 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 顏色格式,將不會那麼麻煩。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章