本文主要总结一下,如何使用AVFoundation的功能来实现图像的采集,主要用到了AVFoundation中的一些类,采集的结构如下图,引用自iOS开发者官网:
AVCaptureSession
采集会话,其主要功能从整体上来掌管图像采集的过程,配置采集的行为,然后控制采集的数据从输入到输出的走向。
AVCaptureDevice
采集设备,简单来说就是从系统获取头像头,对于iOS来说,主要是前置和后置摄像头,如下就是获取采集设备的方式:
let videoDevice = AVCaptureDevice.default(.builtInWideAngleCamera,
for: .video,
position: .unspecified)
AVCaptureDeviceInput
其功能就是作为AVCaptureSession中媒体数据的输入,使用获取到的采集设备来创建
let videoInput = try? AVCaptureDeviceInput(device: videoDevice!)
AVCapturePhotoOutput
作为AVCaptureSession的输出端,主要作用就是提供了静态图片采集工作流的接口,可输出的图片编码和文件有多种比如原始数据的DNG文件,hevc格式的heif文件,以及熟知的jpeg文件等。
AVCapturePhotoSettings
针对单次图像采集请求功能和设置的规范,在调用output的capture接口传入,本例中用得比较简单,先不展开说。比较重要的是,一个settings对象只能用于一次采集,重复使用会crash。
AVCaptureVideoPreviewLayer
是Core Animation中提供的一个layer,用来展示capture的预览图像,只需要将前文提到的capture session创建完成之后设置给layer,然后capture seesion调用startRunning()之后,就能看到预览图像了。如下:
self.videoPreviewLayer.session = self.mediaCapture.captureSession
AVCapturePhotoCaptureDelegate
定义了获取captureOutput中状态和获取采集结果的方法。本例中在调用output的采集方法时传入,实现了photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) 方法,在这个方法中获取采集到的数据。
AVCapturePhoto
在上面的delegate返回采集结果的方法中,有一个参数是AVCapturePhoto对象,通过这个对象,就可以得到采集到的数据,如下:
let photoData = photo.fileDataRepresentation()
let image = UIImage(data: photoData!);
如上面所示,image中就是采集到的数据,可以使用UImageView来展示,也可以将其写入到文件中。后面我将使用metal来渲染这个采集数据。demo代码在我整理后贴出来。
有一点需要的注意的,通过这个方式得到的图像是经过旋转90度、4:3的图像,在使用前需要处理一下。
推荐大家多看官方的文档,对这些类介绍得比较详细,而且smaple code也不错。但是好像swift的demo不是很多😂