音视频- iOS图像采集

本文主要总结一下,如何使用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对象只能用于一次采集,重复使用会抛出invalidArgumentException 异常。

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代码在我整理后贴出来。

        在得到图片数据之后,还可以通过UIImage中的cgImage来查看图像的基本属性,如下所示:

let format: CGImagePixelFormatInfo = CGImagePixelFormatInfo(rawValue: (image?.cgImage?.pixelFormatInfo)!.rawValue) ?? CGImagePixelFormatInfo.RGB555
        
let w: Int = image?.cgImage?.width ?? 0
let h: Int = image?.cgImage?.height ?? 0
        
let components: Int = image?.cgImage?.bitsPerComponent ?? 0
let bits: Int = image?.cgImage?.bitsPerPixel ?? 0

        可以得到当前图像的宽高、格式,一个像素的字节数bits,每一个components(r/g/b/a)的字节数,然后就可以得到通道数bits / components。

        有一点需要的注意的,通过这个方式得到的图像是经过旋转90度、4:3的图像,在使用前需要处理一下。

推荐大家多看官方的文档,对这些类介绍得比较详细,而且smaple code也不错。但是好像swift的demo不是很多😂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值