Android视频录制 花屏、绿屏的分析及解决方案

您所在的位置:网站首页 手机录制出来的视频是什么格式 Android视频录制 花屏、绿屏的分析及解决方案

Android视频录制 花屏、绿屏的分析及解决方案

2024-07-12 17:21| 来源: 网络整理| 查看: 265

      人生苦短,不说废话,不做无用功      

      当我们在用android 开发视频录制时候,会遇到录制出来的视频 花屏、绿屏等现象,不用怀疑,90%是因为视频编码时候的颜色格式和编码器配置的编码格式不匹配。

相机预览的数据一般是两种 NV21和YV12,以下代码可以查出手机支持的预览格式:

List previewFormats = mCamera.getParameters().getSupportedPreviewFormats();

手机MediaCodec编解码颜色格式一般为:

1、COLOR_FormatYUV420Planar 2、COLOR_FormatYUV420SemiPlanar

YUV420Planar支持的颜色格式一般也有两种:I420、YV12

YUV420SemiPlanne支持的颜色格式一般也有两种:NV12、NV21

对应关系如下:

I420: YYYYYYYY UU VV =>标准的YUV420P (COLOR_FormatYUV420Plannar编码格式)

YV12: YYYYYYYY VV UU =>属于YUV420P的一种NV12: YYYYYYYY UVUV =>标准的YUV420SP (COLOR_FormatYUV420SemiPlannar编码格式)NV21: YYYYYYYY VUVU =>属于YUV420SP的一种

 

用Camera摄像头预览的时候:

这里第一个参数data的数据格式,如果没有特殊配置,android默认返回的是NV21格式,查看源码可以看到:

所以如果相机支持YUV420SemiPlanar编码格式,那么NV21数据时没问题的,如果不支持那么需要将NV21的数据格式转为标准的YUV420Planar所支持的

例如:

public final static int NV21_TO_yuv420P(byte[] dst, byte[] src, int w, int h){ int ysize = w * h; int usize = w * h * 1 / 4; byte[] dsttmp = dst; // y System.arraycopy(src, 0, dst, 0, ysize); // u, 1/4 int srcPointer = ysize; int dstPointer = ysize; int count = usize; while (count > 0) { srcPointer++; dst[dstPointer] = src[srcPointer]; dstPointer++; srcPointer++; count--; } // v, 1/4 srcPointer = ysize; count = usize; while (count > 0) { dst[dstPointer] = src[srcPointer]; dstPointer++; srcPointer += 2; count--; } dst = dsttmp; // _EF_TIME_DEBUG_END(0x000414141); return 0; }

  同时设置mediaCodec的颜色编码格式:

 

mediaFormat_camera.setInteger(MediaFormat.KEY_COLOR_FORMAT,mColorFormat); //mColorFormat可以是 MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar 或者 MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar

 

  

 

    如果相机支持YUV420SemiPlanar编码格式,那么NV21需要转为NV12 否则会报错

 

public byte[] nv21ToNv12(byte[] nv21) { if (nv21 == null) return null; int size = nv21.length; byte[] nv12 = new byte[size]; int yLen = (int) (size * 2.0 / 3.0); System.arraycopy(nv21, 0, nv12, 0, yLen); int i = yLen; while (i < size - 1) { nv12[i + 1] = nv21[i]; nv12[i] = nv21[i + 1]; i += 2; } return nv12; } 

 

 

 

 

 

 

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3