美文网首页
Camera实践指南

Camera实践指南

作者: wenju_song | 来源:发表于2018-09-28 19:49 被阅读47次

    camera是音视频开发中重要的数据采集源。Android本身就有两套API,Android 5.0以下的Camera和Android 5.0以上的Camera2,而且更为严重的时,各家手机厂商都Camera2的支持程度也各不相同,这就导致我们在相机开发中要花费很大精力来处理兼容性问题。

    概述

    1. 相机开发的一般流程
      • 检测并访问相机资源检查手机是否存在相机资源,如果存在则请求访问相机资源。
      • 创建预览界面,创建继承自SurfaceView并实现SurfaceHolder接口的拍摄预览类。有了拍摄预览类,即可创建一个布局文件,将预览画面与设计好的用户界面控件融合在一起,实时显示相机的预览图像。
      • 设置拍照监听器,给用户界面控件绑定监听器,使其能响应用户操作, 开始拍照过程。
      • 拍照并保存文件,将拍摄获得的图像转换成位图文件,最终输出保存成各种常用格式的图片。
      • 释放相机资源,相机是一个共享资源,当相机使用完毕后,必须正确地将其释放,以免其它程序访问使用时发生冲突。
    2. 相机开发一般需要注意哪些问题
      • 版本兼容性问题,Android 5.0以下的Camera和Android 5.0以上使用Camera2,Android 4.0以下的SurfaceView和Android 4.0以上的TextureView,Android 6.0以上要做相机等运行时权限兼容。
      • 设备兼容性问题,Camera/Camera2里的各种特性在有些手机厂商的设备实现方式和支持程度是不一样的,这个需要做兼容性测试,一点点踩坑。
      • 各种场景下的生命周期变化问题,最常见的是后台场景和锁屏场景,这两种场景下的相机资源的申请与释放,Surface的创建与销毁会带来一些问题,这个我们 后面会仔细分析。
    3. 关于Camera/Camear2
      • 判断对Camera的支持程度从下面
        • 关于SurfaceView/TextureView
          • SurfaceView是一个有自己Surface的View。界面渲染可以放在单独线程而不是主线程中。它更像是一个Window,自身不能做变形和动画。
          • TextureView同样也有自己的Surface。但是它只能在拥有硬件加速层层的Window中绘制,它更像是一个普通View,可以做变形和动画。
      • 不同厂商对Camera的支持不同,对View的选择也不同
        • 官方的开源库cameraview给出了方案

    Camera实践指南

    • Camera API关键类
      • Camera:操作和管理相机资源,支持相机资源切换,设置预览和拍摄尺寸,设置光圈、曝光等相关参数。
      • SurfaceView:用于绘制相机预览图像,提供实时预览的图像。
      • SurfaceHolder:用于控制Surface的一个抽象接口,它可以控制Surface的尺寸、格式与像素等,并可以监视Surface的变化。
      • SurfaceHolder.Callback:用于监听Surface状态变化的接口。
    • SurfaceView和普通的View区别
      • 普通View都是共享一个Surface的,所有的绘制也都在UI线程中进行,因为UI线程还要处理其他逻辑,因此对View的更新速度和绘制帧率无法保证。这显然不适合相机实时 预览这种情况,因而SurfaceView持有一个单独的Surface,它负责管理这个Surface的格式、尺寸以及显示位置,它的Surface绘制也在单独的线程中进行,因而拥有更高 的绘制效率和帧率。
    • SurfaceHolder.Callback接口里定义了三个函数
      • surfaceCreated(SurfaceHolder holder); 当Surface第一次创建的时候调用,可以在这个方法里调用camera.open()、camera.setPreviewDisplay()来实现打开相机以及连接Camera与Surface 等操作。
      • surfaceChanged(SurfaceHolder holder, int format, int width, int height); 当Surface的size、format等发生变化的时候调用,可以在这个方法里调用camera.startPreview()开启预览。
      • surfaceDestroyed(SurfaceHolder holder); 当Surface被销毁的时候调用,可以在这个方法里调用camera.stopPreview(),camera.release()等方法来实现结束预览以及释放
    • 1.1 打开相机
      • 获取相机信息
    1.1打开相机

    1.2 关闭相机

     camera.release();
    

    1.3 开启预览
    SurfaceView的SurfaceHolder进行
    1.4 关闭预览
    camera.stopPreview();
    1.5 拍照

     takePicture(ShutterCallback shutter, PictureCallback raw, PictureCallback postview, PictureCallback jpeg)
    
    • 参数
      • ShutterCallback shutter:在拍照的瞬间被回调,这里通常可以播放"咔嚓"这样的拍照音效。
      • PictureCallback raw:返回未经压缩的图像数据。
      • PictureCallback postview:返回postview类型的图像数据
      • PictureCallback jpeg:返回经过JPEG压缩的图像数据。

    1.6 开始视频录制

    • 通过MediaRecorder来完成的

    1.7 结束视频录制
    * mediaRecorder.stop();

    Camera2实践指南

    Camera2 API中主要涉及以下几个关键类

    • CameraManager:摄像头管理器,用于打开和关闭系统摄像头
    • CameraCharacteristics:描述摄像头的各种特性,我们可以通过CameraManager的getCameraCharacteristics(@NonNull String cameraId)方法来获取。
    • CameraDevice:描述系统摄像头,类似于早期的Camera。
    • CameraCaptureSession:Session类,当需要拍照、预览等功能时,需要先创建该类的实例,然后通过该实例里的方法进行控制(例如:拍照 capture())。
    • CaptureRequest:描述了一次操作请求,拍照、预览等操作都需要先传入CaptureRequest参数,具体的参数控制也是通过CameraRequest的成员变量来设置。
    • CaptureResult:描述拍照完成后的结果。

    2.1 打开相机

    mCameraManager.openCamera(currentCameraId, stateCallback, backgroundHandler);
    callback中定义回调
    

    2.2 关闭相机

    cameraDevice.close();
    

    2.3 开启预览

    • 创建请求会话的方式进行调用的
      • 调用mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)方法创建CaptureRequest
        mCameraDevice.createCaptureSession()方法创建CaptureSession。

    2.4 关闭预览

    captureSession.close();
    

    2.5 拍照

    对焦
    拍照
    取消对焦
    

    2.6 开始视频录制

    • 关闭预览
    • 初始化MediaRecorder,设置相关参数
    • 构建视频录制aptureRequest
    • 设置预览Surface
    • 设置预览输出Surface
    • 持续发送Capture请求,实现实时预览。
    • 开始录像

    2.7 结束视频录制

    • 关闭预览会话
    • 停止mediaRecorder
    • 释放mediaRecorder

    以上就是对camera的总结。

    相关文章

      网友评论

          本文标题:Camera实践指南

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