Camera Hal3在Framework架构(三):API1与API2区别篇

内容Camera1.0Camera2.0
权限android.permission.CAMERAandroid.permission.CAMERA
布局SurfaceViewTextureView
实现接口SurfaceHolder.Callback 1.surfaceCreated 2.surfaceChanged 3.surfaceDestroyedSurfaceTextureListener 1.onSurfaceTextureAvailable 2.onSurfaceTextureSizeChanged 3.onSurfaceTextureDestroyed 4.onSurfaceTextureUpdated
Camera参数(设置,查看)Camera.Parameters Camera.Size查看:CameraCharacteristics中getCameraCharacteristics(CameraID)设置:CaptureRequest.Builder中void set(Key key, T value)举例:曝光:CaptureReqBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 2);
打开摄像头surfaceCreated中Camera.open(CameraID)onSurfaceTextureAvailable中CameraManager.openCamera(CameraId,CameraDevice.StateCallback,Handler)
开始预览Camera.startPreview()CaptureReqBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);CaptureReqBuilder.addTarget(Surface);Camera.createCaptureSession(Arrays.asList(surface),CaptureSessionStateCallback, Handler);
设置预览方向Camera.setDisplayOrientation(degrees)并没有直接设置预览方向的方法,但是TextureView本身是一个View,支持旋转、平移、缩放,再重写onMeasure方法
图像原始数据byte[]实时获取Camera.PreviewCallback中onPreviewFrame(byte[],Camera)1.onSurfaceTextureUpdated中使用TextureView的getBitmap()方法,但是这里获取到的是Bitmap对象,而我需要的是原始byte[],所以这个方法不适用。2.设置ImageReader.setOnImageAvailableListener监听,在onImageAvailable(ImageReader)通过回调传递的ImageReader.acquireLatestImage()方法获取到一个Image对象(别忘了close(),否则画面会卡住,停止刷新),然后Image.getPlanes()[0].getBuffer()返回了一个ByteBuffer对象,最后new byte[buffer.remaining()]即可得到原始图像的byte[]。别忘了CaptureReqBuilder.addTarget(ImageReader.getSurface()); 否则看不到效果
Camera图像预览尺寸大小设置Camera.Parameters.setPreviewSize(width, height)TextureView. getSurfaceTexture()拿到SurfaceTexture()对象,再通过setDefaultBufferSize(width, height)进行设置。
将来获取到的图片的大小设置Camera.Parameters.setPictureSize(width, height);ImageReader.newInstance(width, height,ImageFormat.YUV_420_888, MAX_IMAGES);
将来获取到的图片的格式设置Camera.Parameters..setPictureFormat(ImageFormat.JPEG);ImageReader.newInstance(width, height,ImageFormat.YUV_420_888, MAX_IMAGES);
  1. Camera2是通过系统服务拿到CameraManager来管理camera设备对象,camera的一次预览、拍照都是向请求会话(CaptureSession.StateCallback,摄像头打开时由相机设备的输出surface组成)发送一次请求(CaptureRequest.Builder)。需要在它的回调onConfigured中进行处理,例如预览,如果不在此方法中写上CameraCaptureSession.setRepeatingRequest(mCaptureReqBuilder.build(), null, mHandler);那么预览就不会成功。

  2. 此外,在创建会话,设置ImageReader监听,都需要传递一个Handler对象,这个Handler对象决定着这些会话、监听的回调方法会被在哪个线程中调用,如果传递的是NULL,那么回调会调用在当前线程。

闪关灯的控制方式

Camera1:
这句代码可以得到摄像头支持的闪光灯模式
List supportedFlashModes = params.getSupportedFlashModes();
控制闪光灯的方法:
params.setFlashMode(Parameters.FLASH_MODE_TORCH );//开启闪光灯

Parameters.FLASH_MODE_TORCH : 闪光灯常开
Parameters.FLASH_MODE_ON :拍照时闪光灯才打开

Camera2:
这句代码可以用来检测当前打开的摄像头是否支持闪光灯
boolean flashAvailable = cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
控制闪光灯的方法:

case 0:
    mBtnFlash.setImageResource(R.drawable.btn_flash_off);
    mPreviewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
    mPreviewBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);
    break;
case 1:
    mBtnFlash.setImageResource(R.drawable.btn_flash_on);
    mPreviewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
    mPreviewBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_SINGLE);
    break;
case 2:
    mBtnFlash.setImageResource(R.drawable.btn_flash_all_on);
    mPreviewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
    mPreviewBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
    break;
  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
相机API2的拍照流程与拍摄RAW照片的流程类似,也涉及到应用层(app)、框架层(framework)和硬件抽象层(HAL),下面是在这个层面上使用相机API2拍照的流程: 1. 应用层(app):应用程序使用相机管理器(CameraManager)打开相机设备,并创建一个用于拍照的会话。 2. 框架层(framework):框架层的相机服务(CameraService)接收应用程序的请求,并与相机驱动程序(camera HAL)进行通信,以控制相机硬件。 3. 硬件抽象层(HAL):相机HAL模块接收来自框架层的请求,并通过与相机硬件的驱动程序进行通信,以控制相机硬件。 4. HAL接收请求:当应用程序发起拍照请求时,请求会被传递到相机HAL模块,即app-fw-hal。 5. HAL配置相机:相机HAL模块会根据请求设置相机的参数,例如曝光时间、ISO等参数。 6. HAL拍照:相机HAL模块通过相机驱动程序控制相机硬件进行拍照操作。 7. HAL输出数据:当拍摄完成后,相机HAL模块将拍摄的JPEG数据传递给框架层。 8. 框架层输出数据:框架层的相机服务将拍摄的JPEG数据传递给应用程序,应用程序可以在该数据上进行后续的处理操作。 9. 应用层处理数据:应用程序可以将JPEG数据保存到文件系统中,或者进行其他的处理操作。 以上就是在相机API2的个层面上拍照的流程,其中app-fw-hal作为相机HAL模块提供了应用程序、框架层和相机驱动程序之间的接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪舞飞影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值