ios-使用AVFoundation自定义系统相机
本文主要是封装一个类,实现相机系统的静态图片捕捉以及视频的功能。
第一步:设置相关参数:

第二步:初始化相关参数:
1.初始化捕捉会话,以及设置图像的分辨率。

2.拿到默认视频捕捉设备,并设置为当前活跃输出对象

3.选择默认音频捕捉设备

4.初始化摄像头静态捕捉对象以及设置捕捉到的图片格式以及添加入捕捉会话对象那

5.创建一个AVCaptureMovieFileOutput 实例,用于将Quick Time 电影录制到文件系统

第三步:开始捕捉和停止捕捉

第四步:配置摄像头可支持的方法,看是否能支持摄像头切换。
1.1:判断摄像头的设备数量是否大于1,如果不大于1的话, 就不支持切换。

1.2获取摄像头的反向设备

1.3.切换摄像头。首先获取当前的反向设备,然后标注配置变化更改,得先移除当前的活跃对象,然后再判断能否添加对象,如果可以的话,就添加当前对象,并设置为活跃对象,如果不能添加,就把刚刚移除的对象重新添加回来。然后结束配置。

2.1实现聚焦方法。首先判断当前摄像头是否支持兴趣点对焦以及是否自动对焦。如果支持的话,再对其进行模式的切换,在切换过程,为了安全起见,对焦模式的更改必须对其进行加锁处理。

3.1实现曝光方法。首先判断是否支持曝光,重写cameraSupportsTapToExpose的get方法

3.2 获取点击的曝光点,然后看是否支持曝光,如果支持的话,则调整曝光模式,如果当前设备不再调整曝光模式,就使用KVO对其再进行调整。在调整曝光模式当前,为了安全起见,得对当前设备进行加锁处理。

3.3 判断设备是否不再调整曝光等级,确认设备的exposureMode是否可以设置为AVCaptureExposureModeLocked,如果是的话,就将当前模式调整为AVCaptureExposureModeLocked。

3.4 重新设置对焦和曝光模式。捕捉设备的范围是0-1,判断获取对焦兴趣点 和 连续自动对焦模式 是否被支持,以及判断确认曝光度是否可以被重设。如果支持的话,将调整的范围点给聚焦点和曝光点给赋值,并将其相关的模式给更改。

4.1 判断是否有闪光灯

4.2 重写闪光灯的get方法

4.3 设置闪光灯,重写他的set方法

5.1 是否支持手电筒

5.2 获取它的手电筒模式

5.3 设置手电筒,重写他的set方法

第五步:拍摄静态图片。首先获取输出链接,然后判断是否支持设置方向,然后进行调整。最后将捕捉成功的照片写入相册。
1.1 获取方向值

1.2.拍摄静态图片,拍摄成功后,会传入相册,

1.3 写入相册,成功后,发送捕捉图片通知。用于绘制程序的左下角的缩略图。

1.4 发送通知给VC,显示缩略图。

第六步:1.1捕捉视频。首先判断是否为录制状态,如果否的话,就获取当前的捕捉链接信息。然后判断是否支持修改当前的视频方向。然后对其进行更改。然后设置当前的视频质量为高质量。然后写入视频的文件格式,最终进行记录。

1.2写入视频唯一文件系统URL 。这个文件是临时文件,只有在最终录制完成的时候,才会显示最后的mov格式。

1.3 停止记录

1.4 实现回调的方法,当停止记录的时候,需要在回调方法那捕捉到的视频写入相册。
-(void)captureOutput:(AVCaptureFileOutput*)output didFinishRecordingToOutputFileAtURL:(NSURL*)outputFileURL fromConnections:(NSArray *)connections error:(NSError*)error

1.5 将视频写入相册,创建ALAssetsLibrary 对象,然后判断当前的适配能否被写入,如果可以的话,将捕捉到的视屏放进一个block快那,然后调用writeVideoAtPathToSavedPhotosAlbum:completionBlock 方法,将其成功写入,如果成功写入的话,就调用通知显示视频缩略图。

1.6 获取视频的缩略图。通常视频的缩略图都是为他的第一帧图片。首先获取它的AVAssetImageGenerator对象,然后在由AVAssetImageGenerator 设置他的maximumSize,这时候会根据他的宽度就可以了,
