Part1: Camera1(Android的傻瓜机)
camera1 的开发过程比较简单,对于常规视频采集,若是只要通常的预览功能,是没问题的,然而若是想要挖掘Camera更多的功能,camera1没法知足,因而有了camera2.
Part2: Camera2(Android的单反)
(1)CameraDevice.StateCallback ///好比线程A发送打开相机请求, 线程B中收到相机状态回调,线程B中与cameraDevice创建会话,设置参数,数据回调处理;
(2)CameraCaptureSession.StateCallback ///与CameraDevice创建会话后,收到的会话状态回调;
(3)ImageReader.OnImageAvailableListener // 开发者能够直接获取而且操做的数据回调;
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开发支持库。
-
特色:
-
更简单易用的API,更少的代码量,使开发者更专一业务的个性化实现。好比:对采集到图片作分析处理。
-
更好的兼容性,减小不一样设备适配烦恼:包括宽高比、屏幕方向、旋转、预览大小和高分辨率图片大小。
-
数据分析: 开发者依然能够对数据进行个性化处理。
-
第三方Camera特效拓展:对于一些手机厂商特定实现的camera特效,开发者也可使用。
-
Code Sample 1(CameraX的常规使用)
(1)CameraX 建立UseCaseConfig; //已经提早实现好各类UseCase(preview,ImageCapture,ImageAnalysis...)对应不一样的UseCaseConfig, 开发者重要专一本身的业务。
(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
(SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Coordinate system:
Camera1 和 Camera2的坐标系不同,因此在View坐标和相机坐标系转换的时候是不同的。git
Render:
-
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
-
glCreateShader(...);
-
glShaderSource(...);//bind Vertex/Segment program with Vertex/Segment object
-
glCompileShader(...);
-
glCreateProgram(...);
-
glAttachShader(...);///attach Vertex/Segment object with Shader program
-
glLinkProgram(...);
-
glUseProgram(...); //draw
对于Texture的数据采集,直接在GPU中建立Texture Object并拿到Texture id,Camera 的采集数据直接交给texture object 进行离屏渲染。
对于Byte Buffer的数据采集,须要将YUV数据加载到纹理object,再进行离屏渲染。
两种比较起来,直接用Texture 数据进行采集,能够省去cpu往GPU的数据拷贝过程,更高效。
Part5:Camera Next Plane