Android Camera的进化史

Part1: Camera1(Android的傻瓜机)

  • Camera1 的开发中,打开相机,设置参数的过程是同步的,就跟用户实际使用camera的操做步骤同样。可是若是有耗时状况发生时,会致使整个调用线程等待;
  • 开发者若是想要个性化设置camera效果,没法手动设置调整参数,须要依靠第三方算法对于回调的数据进行处理(NV21)。并且不一样手机的回调数据效果都是不同的,采用第三方算法调整,一般效果很差;
  • 开发者所能获取的Camera状态信息有限;
camera1 的开发过程比较简单,对于常规视频采集,若是只要通常的预览功能,是没问题的,然而若是想要挖掘Camera更多的功能,camera1没法知足,因而有了camera2.

Part2: Camera2(Android的单反)

  • Camera2 的开发中,camera的生命周期都是异步的,即发送请求,等待回调的client-service模式;
  • 系统: Android L+;
  • 这里的关键回调主要是三个:
(1)CameraDevice.StateCallback ///好比线程A发送打开相机请求, 线程B中收到相机状态回调,线程B中与cameraDevice创建会话,设置参数,数据回调处理;
(2)CameraCaptureSession.StateCallback ///与CameraDevice创建会话后,收到的会话状态回调;
(3)ImageReader.OnImageAvailableListener // 开发者能够直接获取而且操做的数据回调;
  • 经过跟相机创建的会话,能够更加精细的调整Camera参数:好比ISO感光度,曝光时间,曝光补偿……;
  • 若是开发者想要更多本身的定制,也能够直接使用回调数据(YUV488);
  • MultiCamera的支持;

Multi-Camera 的支持:

  • 系统:Android P+;
  • 目前支持的multi-camera的设备: Pixel 3, mate20 系列;
  • Multi-Camera 新功能:
(1)更好的光学变焦:以前的方式一般使用数码变焦或者是单个摄像头的光学变焦来达到变焦的效果, 经过多摄像头的变焦方式,不管远景仍是近景,均可以采到更好质量的数据。
(2)景深计算:经过多摄像头的景深不一样,能够获得每一帧图片中不一样物体的景深,从而更好的区分前景或者后景。应用范围:背景虚化,背景替换,现实加强。
(3)更广的视角:更广的视角带来鱼眼镜头的畸变效果,畸变矫正功能。 CaptureRequest.DISTORTION_CORRECTION_MODE
(4)人脸识别功能:跟畸变效果同样,自带人脸识别功能。应用范围:人脸裁剪,人脸特效。 CaptureResult.STATISTICS_FACE_DETECT_MODE
(5)多路流同时采集:场景包括(单摄像头输出多流,多摄像头输出多流) normalOutputConfigImageReader.setPhysicalCameraId(normalLensId) wideOutputConfigImageReader.setPhysicalCameraId(wideAngleId) params.previewBuilder?.addTarget(normalSurface) params.previewBuilder?.addTarget(wideSurface)
  • 带来的问题:更耗内存,更耗电
  • 趋势:单个手机中,支持更多的摄像头
Camera2 虽然给开发者带来了相机的更多可玩性,然而android的碎片化,致使不少设备的兼容性问题频繁发生。尤为国内的手机厂商,对camera2 的支持程度各不相同,
因此Camera2的开发难度更多的是在兼容性,因而有了CameraX。

Part3: CameraX(Android的个性化相机)

  • 系统:Android L+
  • Jetpack 内的一套Camera开发支持库。
  • 特色:
  1. 更简单易用的API,更少的代码量,使开发者更专一业务的个性化实现。好比:对采集到图片作分析处理。
  2. 更好的兼容性,减小不一样设备适配烦恼:包括宽高比、屏幕方向、旋转、预览大小和高分辨率图片大小。
  3. 数据分析: 开发者依然能够对数据进行个性化处理。
  4. 第三方Camera特效拓展:对于一些手机厂商特定实现的camera特效,开发者也可使用。
  5. Code Sample 1(CameraX的常规使用)
(1)CameraX 建立UseCaseConfig; //已经提早实现好各类UseCase(preview,ImageCapture,ImageAnalysis...)对应不一样的UseCaseConfig, 开发者重要专一本身的业务。
(2)建立对应UseCase
(3)CameraX bindToLifecycle(LifeCycleOwner, UseCases) //CameraX 会观察生命周期以肯定什么时候打开相机、什么时候建立拍摄会话以及什么时候中止和关闭。
(4)CameraX unbind(UseCase)
6. Code Sample 2(CameraX的特效拓展)

Part4: 开发二三事

Rotation:

Camera1 和 Camera2 上来的数据角度是不同;Camera2的某些设备,前置摄像头的sensor orientation是不一致的。通常前置270,后置90。android

  • 相机角度获取: Camera1:CameraInfo.orientation Camera2:CameraCharacteristics.SENSOR_ORIENTATION
  • 手机角度: 经过传感器获取:
(SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
  • APP角度获取:
经过WindowManager:
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

Coordinate system:

Camera1 和 Camera2的坐标系不同,因此在View坐标和相机坐标系转换的时候是不同的。git

  • Camera1的坐标系:
  • Camera2的坐标系:

Render:

YUV数据的纹理映射:
  • glGenTextures(...);///create glTexture id
  • glBindTextures(...); //bind texture into Gl context
  • glTexParameterf(...);//filter param set when Texture Maping
  • glTexImage2D(...); // load YUV data
  • GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0) //unBinde Texture
离屏渲染:
  • glGenFramebuffers(...);
  • glBindFramebuffer(...);
  • glFramebufferTexture2D(...); //bind frame buffer with Texture
  • glDrawArrays(...); //draw texture data into frame buffer
  • glReadPixels(...); //get frame buffer data for snapshot.
  • glBindFramebuffer(...);// unbind texture
GLSL:
  • glCreateShader(...);
  • glShaderSource(...);//bind Vertex/Segment program with Vertex/Segment object
  • glCompileShader(...);
  • glCreateProgram(...);
  • glAttachShader(...);///attach Vertex/Segment object with Shader program
  • glLinkProgram(...);
  • glUseProgram(...); //draw
总结:
Camera的数据输出格式:
对于Texture的数据采集,直接在GPU中建立Texture Object并拿到Texture id,Camera 的采集数据直接交给texture object 进行离屏渲染。
对于Byte Buffer的数据采集,须要将YUV数据加载到纹理object,再进行离屏渲染。
两种比较起来,直接用Texture 数据进行采集,能够省去cpu往GPU的数据拷贝过程,更高效。

Part5:Camera Next Plane

添加本身的CameraX功能
Reference :
相关文章
相关标签/搜索