【iOS】自定义相机(一)基础介绍

作者: Seacen_Liu | 来源:发表于2019-04-11 16:18 被阅读134次

    前言

    在开发中,我们使用UIImagePickerController可以很简单的使用系统的相机进行拍照,但这个固定样式的相机并不灵活。很多时候,我们可能需要自定义相机、需要录制音频。这时候就需要使用 AVFoundation 获取摄像头与麦克风的信息来进行拍照、录制视频和录制音频的操作。

    当前效果图

    该系列的文章处于不断更新的过程中,项目地址如下:SCCamera

    【iOS】自定义相机(二)权限获取
    【iOS】自定义相机(三)预览视图
    【iOS】自定义相机(四)会话配置
    【iOS】自定义相机(五)相机设置
    【iOS】自定义相机(六)拍照与录像
    【iOS】自定义相机(七)人脸检测

    欢迎各位提出自己宝贵的建议,谢谢!觉得有用的可以点个赞或者Star一下哦~

    AVFoundation 媒体捕获架构

    AVCaptureSession是在做自定义相机里面最重要的一个类,我们需要将各种音视频捕获的输入(AVCaptureInput)与输出(AVCaptureOutput)添加到session中。最终通过运行session来让这些输入输出协同工作起来。

    AVFoundation 媒体捕获架构.png

    上图中左侧的属于AVCaptureInput,右侧的属于AVCaptureOutput。箭头的指向表示的是一个音视频流输入和输出的方向。

    • AVCaptureSession:捕捉会话
      • AVFoundation 媒体捕获的核心类
      • 一个捕捉会话相当于一个虚拟的“插线板”,用于连接输入和输出的资源
    • AVCaptureDevice:捕捉媒体设备
      • 摄像头和麦克风等物理设备的接口
    • AVCaptureInput:捕捉输入
      • AVCaptureDeviceInput:音视频捕获设备输入类
        • 需要使用AVCaptureDevice创建
        • 音频和视频需要使用麦克风和摄像头分别获取
    • AVCaptureOutput:捕捉输出
      • AVCaptureVideoDataOutput:视频数据输出类
        • 通过AVCaptureVideoDataOutputSampleBufferDelegate获取视频流数据,即视频中每一帧的数据
      • AVCaptureAudioDataOutput:音频数据输出类
        • 通过AVCaptureAudioDataOutputSampleBufferDelegate获取音频流数据,即每一帧的音频数据
      • AVCaptureMetadataOutput:识别结果输出类
        • 通过AVCaptureMetadataOutputObjectsDelegate获取系统原生的识别结果
        • 可以用来进行简单的人脸检测、二维码扫描,具体需要调用[_metaOutput availableMetadataObjectTypes]查看当前设备支持的识别功能
      • AVCaptureStillImageOutput:静态图片输出类
        • 用于进行拍摄静态照片
        • 在iOS10被弃用,需要使用AVCapturePhotoOutput来替代(AVCapturePhotoOutput将会在后面的文章中进行介绍)
      • AVCaptureMovieFileOutput:视频文件输出类
        • 用于进行视频录制
        • ※ 现在AVCaptureMovieFileOutput还不能与AVCaptureVideoDataOutput共用,所有后面我将提供两种录制视频的方式
    • AVCaptureVideoPreviewLayer:预览显示用的CALayer
      • 将相机采集到的视频数据渲染到Layer上,进行预览鲜果展示
      • 通过设置该类的session属性为当前AVCaptureSession对象即可,十分方便快捷
    • AVCaptureConnection:连接
      • 在上图中,其实还有一个类没有明确的名字,而是由一个连接不同组件的黑色箭头所表示
      • 捕捉会话首先需要确定由给定捕捉设备输入渲染的媒体类型,并自动创建其能够接受该媒体类型的捕捉输出端的连接

    自定义相机架构设计

    整体采用 MVC 进行架构,主要是将视图布局和复杂的 AVFoundation 对象操作使用分层,并且采用 Manager 来独立封装摄像头操作、拍照操作、录制视频操作。

    整体架构

    架构优点

    • 分层:视图层与逻辑层区分,使得 UI 层的修改十分方便
    • 封装:对 AVFoundation 中的操作进行分类,分成三个不同Manager,有助于增加SCCameraController中代码的可读性
    • 灵活SCCameraController持有session和各种输入输出。这种方式看似比较杂乱,但比较具有灵活性。我们只需要将需要用到的视图、需要的输入输出和对应的操作Manager组合在一起就可以完成对应的需求。

    自定义相机启动主要流程

    1. 检查相机与麦克风权限
    2. 创建AVCaptureSession对象
    3. 创建AVCaptureDeviceInput并添加到session
    4. 设置AVCaptureVideoPreviewLayersession属性,显示预览效果
    5. 创建AVCaptureDeviceOutput并添加到session
    6. [session startRunning]开始工作

    官方文档

    Cameras and Media Capture
    AVCam: Building a Camera App

    相关文章

      网友评论

        本文标题:【iOS】自定义相机(一)基础介绍

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