0%

AVFoundation采集API

核心类

AVCaptureSession

排插,用于建立输入、输出图的关系。

提供操作:

  • 预设配置
  • 增删查输入、输出
  • 增删查连接
  • 开始、停止运行
  • 开始、提交配置

使用注意:

  • 方法调用应在一个独立的串行队列中进行,以防止影响主线程和实现同步操作。
  • 中断通过通知进行监听。

AVCaptureDevice

采集设备硬件功能的封装。

使用注意:

  • 使用硬件功能时,需要判断该功能是否可用;
  • 修改设备配置前,需要调用lockForConfiguration进行锁定,以防止外界修改;对应的修改完毕后,调用unlockForConfiguration

AVCaptureDeviceInput

采集设备作为输入的封装。需要封装成 Input 才能添加会话中。

使用注意:

  • 切换设备其逻辑要包裹在AVCaptureSession的beginConfigurationengdConfiguration中,需要根据设备创建Input,先移除后添加。

AVCaptureOutput

抽象输出类,其根据实际的目标数据的需求会有对应的具体类。 + StillImageOutput:静态图片输出 + 图片输出配置 + 拍照操作 + MovieFileOutput:音视频文件输出 + 文件大小限制 + 录制开始和停止操作 + AudioFileOutput:音频文件输出 + 音频格式配置 + 元数据存取 + AudioDataOutput:原始音频帧输出 + 音频格式配置 + VideoDataOutput:原始音频帧输出 + 视频格式配置 + MetadataOutput:元数据输出,可以实现二维码、人脸识别 + DepthDataOutput:深度数据输出

提供connection获取和坐标转换。具体的类通过不同的代理异步输出数据。

AVCaptureConnection

建立输入和输出的连接,用于控制数据流。只要Input和Output都添加到Session,则可以直接向Output获取Connection。否则需要手动建立连接。

可配置与设备硬件无关的软件处理:videoOrientation、videoScaleAndCropFactor、videoMirroring、videoStabilization。其他的参数需要配置AVCaptureDevice。

AVCaptureVideoPreviewLayer

可直接关联(强引用)AVCaptureSession实现预览。

采集案例

摄像头坐标转换

AVCaptureVideoPreviewLayer 提供摄像头坐标和屏幕坐标的转换方法:

1
2
3
4
5
// 屏幕坐标 -> 摄像头坐标
- (CGPoint)captureDevicePointOfInterestForPoint:(CGPoint)pointInLayer;

// 摄像头坐标 -> 屏幕坐标
- (CGPoint)pointForCaptureDevicePointOfInterest:(CGPoint)captureDevicePointOfInterest;

采集会话配置

  1. 创建 AVCaptureSession;
  2. 设置分辨率;
  3. 使用 AVCaptureDevice 方法获取其对应类型的对象;
  4. 为设备对象创建 Input;
  5. 判断会话能否添加该 Input(因为有可能其他应用在使用该设备),是则添加;可将设备对象/input 存到属性,以备切换设备时做判断。
  6. 创建 Output 对象,设置其格式。
  7. 判断+添加。可以添加多个 Output。

开始与停止就是调用 Running 相关的方法。

欢迎关注我的其它发布渠道