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

该系列的文章记录着自定义相机的方式,项目地址如下:SCCamera

【iOS】自定义相机(一)基础介绍
【iOS】自定义相机(二)权限获取
【iOS】自定义相机(三)预览视图
【iOS】自定义相机(四)会话配置
【iOS】自定义相机(五)相机设置
【iOS】自定义相机(六)拍照录像
【iOS】自定义相机(七)人脸检测
【iOS】自定义相机(八)拍照进阶
【iOS】自定义相机(九)录像进阶
【iOS】自定义相机(十)资源保存

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

前言

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

《【iOS】自定义相机(一)基础介绍》 当前效果图

AVFoundation 媒体捕获架构

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

《【iOS】自定义相机(一)基础介绍》 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:连接
    • 在上图中,其实还有一个类没有明确的名字,而是由一个连接不同组件的黑色箭头所表示
    • 捕捉会话首先需要确定由给定捕捉设备输入渲染的媒体类型,并自动创建其能够接受该媒体类型的捕捉输出端的连接

SCCamera 架构设计

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

《【iOS】自定义相机(一)基础介绍》 整体架构

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

Manager 使用策略

  • 拍照:SCStillPhotoManagerSCPhotoManager
  • 录像:SCMovieFileOutManagerSCMovieManager
  • 相机操作:SCCameraManager

自定义相机启动主要流程

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

官方文档

Cameras and Media Capture
AVCam: Building a Camera App

    原文作者:Seacen_Liu
    原文地址: https://www.jianshu.com/p/bda892975692
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞