为了从设备上捕获内容,例如从相机和麦克风,你需要将输入和输出组织起来,需要用捕获回话AVCaptureSession来在他们之间协调数据流.你最少需要下面四个东西:
AVCaptureDevice
:一个输入设备,例如相机或者麦克风
AVCaptureInput的一个子类实例,用来配置输入设备的端口.
AVCaptureOutput的一个子类实例,用来管理视频或者图片的输出.
AVCaptureSession
捕获回话,用来协调输入输出,管理数据流.
为了向用户展示相机在记录的东西,可以使用预览层AVCaptureVideoPreviewLayer
.
AVCaptureSession
AVCaptureSession 是用来管理数据捕获的协调中心,可以协调从输入到输出的数据流,你可以把输入和输出添加到回话,通过启动回话startRunning来获取数据流,通过结束回话stopRunning来结束数据流.
AVCaptureSession *session = [[AVCaptureSession alloc] init];
// Add inputs and outputs.
[session startRunning];
配置回话,可以对回话进行预配置,例如指定图片质量,分辨率等.
if ([session canSetSessionPreset:AVCaptureSessionPreset1280x720]) {
session.sessionPreset = AVCaptureSessionPreset1280x720;
}
else {
// Handle the failure.
}
如果不想用预设调整,或者相对运行的会话进行调整,需要调用开始配置和提交配置的方法.这个方法确保设备改变是作为一个组发生的,而且是安全的.调用完开始配置之后,就可以添加和移除输入输出,改变预设属性,或者配置单个输入输出的属性,所有的更改都不会实际发生,只有提交了变更之后才会更改.
[session beginConfiguration];
// Remove an existing capture device.
// Add a new capture device.
// Reset the preset.
[session commitConfiguration];
监控会话状态的改变
会话改变时会发送通知给观察者,比如,启动回话,停止回话,或者会话被打断.你可以注册一个观察者来接受错误发生的通知,你也可以使用running属性来判断是否在运行,interrupted属性来看是否被打断了.此外,这两个属性都是支持kvo的,通知是在主线程发送的.
AVCaptureDevice
比如前置相机,后置相机,麦克风 都是捕获设备
可以使用类方法来判断有哪些类型和是否可用.下面的列子列出了所有可能的设备,打印了他们的名字,对于视频类型,还打印了他们的位置(前置,后置)
NSArray *devices = [AVCaptureDevice devices];
for (AVCaptureDevice *device in devices) {
NSLog(@"Device name: %@", [device localizedName]);
if ([device hasMediaType:AVMediaTypeVideo]) {
if ([device position] == AVCaptureDevicePositionBack) {
NSLog(@"Device position : back");
}
else {
NSLog(@"Device position : front");
}
}
}
设置捕获设置
不同的设备有不同的能力,比如有些支持聚焦和闪光灯,有些支持兴趣点等.
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
NSMutableArray *torchDevices = [[NSMutableArray alloc] init];
for (AVCaptureDevice *device in devices) {
[if ([device hasTorch] &&
[device supportsAVCaptureSessionPreset:AVCaptureSessionPreset640x480]) {
[torchDevices addObject:device];
}
}
If you find multiple devices that meet your criteria, you might let the user choose which one they want to use. To display a description of a device to the user, you can use its localizedName
property.
In all cases, you should lock the device before changing the mode of a particular feature, as described in Configuring a Device.
焦点兴趣点和曝光点是相互排斥的,焦点模式和曝光模式也是相互排斥的。
有三种聚焦模式:
AVCaptureFocusModeLocked
:焦距位置是固定的。当你允许用户组合场景,然后锁定焦点,这很有用。
AVCaptureFocusModeAutoFocus
: 相机执行单个扫描对焦,然后还原锁定。这适合于您想要选择要聚焦的特定项目,然后将焦点保持在该项目上的情况,即使它不是场景的中心。
AVCaptureFocusModeContinuousAutoFocus
: The camera continuously autofocuses as needed.