AVFoundation---切换摄像头

切换捕捉画面的输入设备(前后置摄像头)的主要操作有以下3步:

一、根据媒体类型获取当前捕捉输入物理设备的总数(是否包含前置摄像头);

//是否可以切换摄像头

- (BOOL)canSwitchCameras {                                                                                            //1.获取当前媒体类型的设备数组                                                                            NSUInteger count = [[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo] count];                                              return count > 1;                                                                                                                 }

二、根据当前处于活跃状态的输入设备,获取未使用的输入设备,(比如当前采集画面的是后置摄像头,这一步需要获取前置摄像头)//根据指定的物理方位返回系统输入设备

//根据指定的物理方位返回系统输入设备

- (AVCaptureDevice *)cameraWithPosition:(AVCaptureDevicePosition)position {

NSArray * devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];

for (AVCaptureDevice * device in devices) {

if (device.position == position) {

return device;

}

}

return nil;

}

//获取当前未使用的输入设备(未激活的摄像头)

- (AVCaptureDevice *)inActivityCamera {

AVCaptureDevice * device = nil;

if ([self canSwitchCameras]) {

if (self.activityDevice.device.position == AVCaptureDevicePositionBack) {

//注意,这里正好时相反的AVCaptureDevicePosition。

device = [self cameraWithPosition:AVCaptureDevicePositionFront];

}else {

device = [self cameraWithPosition:AVCaptureDevicePositionBack];

}

}

return device;

}

三、获取未使用的输入设备后,需要将其装载到会话Session中,注意 beginConfiguration/commitConfiguration 这两个方法,成对出现,缺一不可。

#pragma mark 摄像头转换

- (IBAction)switchCameras:(id)sender {

if (![self canSwitchCameras]) {

NSLog(@"不支持切换摄像头");

}

NSError * error;

AVCaptureDevice * inActivityDevice = [self inActivityCamera];

AVCaptureDeviceInput * deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:inActivityDevice error:&error];

if (deviceInput) {

//开始装置设备。

[self.capSession beginConfiguration];

[self.capSession removeInput:self.activityDevice];

if ([self.capSession canAddInput:deviceInput]) {

[self.capSession addInput:deviceInput];

self.activityDevice = deviceInput;

}else {

//切换失败时,重现将之前的设备添加到会话Session中。

[self.capSession addInput:self.activityDevice];

}

//装置完毕后,需要提交此次的修改。

[self.capSession commitConfiguration];

}else {

NSLog(@"切换摄像头出错");

}

}

经过以上三步就可以实现摄像头切换的功能。

Demo地址:摄像头切换

你可能感兴趣的:(AVFoundation---切换摄像头)