美文网首页
Android音视频(1) Camera基础使用

Android音视频(1) Camera基础使用

作者: 浪里_个郎 | 来源:发表于2020-06-23 18:03 被阅读0次

1,Camera基本调用流程

android相机基本使用流程

CameraManager:管理所有的摄像头(CameraDevice)设备的管理者,打开摄像头等功能。
CameraDevice:一个手机设备一般有两个摄像头(CameraDevice),前置和后置。该类通过CameraCharacteristics对象提供摄像头的硬件信息,配置信息和输出参数等。

2,图像相关概念

YUV类型

YUV 4:4:4采样,每一个Y对应一组UV分量。
YUV 4:2:2采样,每两个Y共用一组UV分量。
YUV 4:2:0采样,每四个Y共用一组UV分量。
我们可以通过y和uv数据量大小的比值,来判断采样类型。
同为YUV420,也有不同的数据存放形式,形成了不同的数据类型:

Y Y Y Y Y Y      Y Y Y Y Y Y      Y Y Y Y Y Y      Y Y Y Y Y Y
Y Y Y Y Y Y      Y Y Y Y Y Y      Y Y Y Y Y Y      Y Y Y Y Y Y
Y Y Y Y Y Y      Y Y Y Y Y Y      Y Y Y Y Y Y      Y Y Y Y Y Y
Y Y Y Y Y Y      Y Y Y Y Y Y      Y Y Y Y Y Y      Y Y Y Y Y Y
U U U U U U      V V V V V V      U V U V U V      V U V U V U
V V V V V V      U U U U U U      U V U V U V      V U V U V U
 - I420 -          - YV12 -         - NV12 -         - NV21 -

YUV中的plane和stride

plane指描述像素点的所有信息维度。比如RGB格式就有三个plane分别为R、G、B。YUV的话也是三个,y、u和v。

Image.getPlanes();  //获取图像所有的planes数据

stride指在内存中每行像素所占的空间。如下图所示,为了实现内存对齐(或者其它的什么原因),每行像素在内存中所占的空间并不是图像的宽度。

Image.getPlanes()[0].getRowStride(); //从Plane中获取stride

图像类型转换

YUV_420_888表示YUV420格式的集合,888表示Y、U、V分量中每个像素点占8bit(1Byte)。我们通过Camera获取的时候它是没有指具体的格式的,只是通过ImageReader给了我们y,u,v三个plane,我们可以自己将它组装成特定的YUV数据。

//组装NV21图像
public static byte[] yuv420ToNv21(byte[] y, byte[] u, byte[] v) {
  Byte[] nv21 = new Byte[y.length+u.length+v.length];
  //先组装y数据
  System.arrayCopy(y,0,nv21,0,y.length);
  int uIndex = 0;
  int vIndex = 0;
  //开始组装uv数据
  for(int i=y.length;i<nv21.length;i++) {
    nv21[i] = v[vIndex++];
    nv21[i+1] = u[uIndex++];
  }
}
//将nv21转换为YuvImage
YuvImage yuvImage = new YuvImage(nv21, ImageFormat.NV21, stride, height, null);
//转为jpeg
yuvImage.compressToJpeg(new Rect(0, 0, previewSize.getWidth(), previewSize.getHeight()), 100, byteArrayOutputStream);
byte[] jpgBytes = byteArrayOutputStream.toByteArray();
//生成bitmap
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
final Bitmap originalBitmap = BitmapFactory.decodeByteArray(jpgBytes, 0, jpgBytes.length, options);

参考代码

https://github.com/nicochofly/Test4Camera2
https://github.com/wangshengyang1996/Camera2Demo

相关文章

网友评论

      本文标题:Android音视频(1) Camera基础使用

      本文链接:https://www.haomeiwen.com/subject/ziaoxktx.html