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

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

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

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

前言

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

当前效果图

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

SCCamera 架构设计

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

整体架构
  • 分层:视图层与逻辑层区分,使得 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容