AVFoundation是苹果在iOS和OS X系统中用于处理基于时间的媒体数据的Objective-C框架. 供使用者来开发媒体类型的应用程序.
虽然现在你可以在iOS和 OS X系统中通过WebView或HTML标签直接来播放音视频内容,但是如果想要加入额外媒体相关功能如:录制,音视频流控制,添加额外动画和图片效果等.则需要专门的音视频框架进行控制.
- AVCaptureSession 捕捉会话
AVCaptureSession相当于一个虚拟的插座,连接了输入和输出资源.它管理着从物理设备(摄像头和麦克风)得到的数据流,然后输出到其他地方.
可以额外配置一个会话预设值,用来控制捕捉数据的格式和质量,默认是AVCaptureSessionPresetHigh
- AVCaptureDevice 捕捉设备
AVCaptureDevice为物理设备定义一个接口和大量控制方法,例如对焦、曝光、白平衡和闪光等
- 捕捉设备输入 AVCaptureDeviceInput
在使用AVCaptureDevice进行处理前,需要将它封装到AVCaptureDeviceInput实例中.因为一个捕捉设备不能直接添加到AVCaptureSession中
- 捕捉的输出 AVCaptureOutput
AVCaptureOutput有许多扩展类,它本身只是一个抽象基类,用于为从Session得到的数据寻找输出目的地. 看上面结构图就可以看出各扩展类功能方向, 这里单独说一下,AVCaptureAudioDataOutput和AVCaptureVideoDataOutput可以直接访问硬件扑捉到的数字样本,可以用于音视频流进行实施处理
- 捕捉连接 AVCaptureConnection
这个类其实就是上图中连接不同组件的连接箭头所表示. 对这些连接的访问可以让开发者对信号流就行底层控制,比如禁用某些特定的连接,或者音频连接中限制单独的音频轨道
- 捕捉预览 AVCaptureVideoPreviewLayer
这个类不在上图中, 它是对捕捉视频数据进行实时预览.在视频角色中类似于AVPlayerLayer
捕捉会话应用流程
a.用之前先判断相机权限:
b. 创建会话
@property (nonatomic,strong) AVCaptureDevice *cam_back;
@property (nonatomic, strong) AVCaptureSession *session;
@property (nonatomic, strong) AVCaptureVideoDataOutput *videoDataOutput;
@property (nonatomic, strong) AVCaptureVideoPreviewLayer *videoPreviewLayer;
c . 停止,启动,检查会话
其他细节(切换摄像头,聚焦)
a.切换摄像头
b.代理处理数据(拍照)
@property (nonatomic,copy) NSArray *currentmetadata;
typedef void (^ShutterImageBlock)(UIImage *image);
@property (nonatomic,copy) ShutterImageBlock callBack;
从获取的sampleBuffer中获取图片数据
c.聚焦
手动聚焦方式:点击屏幕,获取point数据,调用捕捉的设备 setFocusPointOfInterest和setFocusMode , 两者调用顺序不能变。
_focusView是UIView类型,显示点击的区域。
注意⚠️:给设备配置属性时需要用lockForConfiguration ,unlockForConfiguration 包住,不然会使APP崩溃。
在初始化session时添加点击事件,用来获取点击的CGPoint