Android视频采集编码颜色格式选择

ps: 在Android平台通过Camera PreviewCallback预览帧回调的方式采集视频,并通过MediaCodec进行h264编码的时候,camera的setPreviewFormat的预览格式设置,和MediaCodec编码时需要设置MediaFormat的MediaFormat.KEY_COLOR_FORMAT的格式的对应关系的设置。

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);


Android视频采集编码颜色格式选择_第1张图片

Android视频采集编码颜色格式选择_第2张图片

Android视频采集编码颜色格式选择_第3张图片

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 颜色格式,将不会那么麻烦。

更多相关文章

  1. Color State List用于控件在各状态下的文本颜色显示
  2. Android中解析doc、docx、xls、xlsx格式文件
  3. Android修改图片颜色-转成灰度图
  4. Android录音并实时转成MP3格式
  5. Android开发的文件格式概述
  6. 【Android】CheckBox修改选中和未选中颜色
  7. Android OpenGL ES学习笔记之添加颜色

随机推荐

  1. Android 5.0(Lollipop)中的SurfaceTextur
  2. Android_Bluetooth详解
  3. 自定义控件:抽屉SlidingDrawer——wrap_co
  4. 一篇文章带你走通 OkHttp+Retrofit+Rxjav
  5. Android保存图片到系统图库
  6. Android动态壁纸详解
  7. Android View之用户界面...
  8. Android应用开发常用知识
  9. MTK android 6572的一个编译的脚本
  10. 查看Activity栈