切换捕捉画面的输入设备(前后置摄像头)的主要操作有以下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地址:摄像头切换