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

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

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

1.请参考以下链接,首先了解YUV420P,YUV420SP,NV21,YV12这些基本的颜色格式


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 颜色格式,将不会那么麻烦。
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值