目前我知道有兩種實現方法.
1.基于 AVFoundation 實現
2.利用 GPUImage 框架實現
一.利用 AVFoundation 實現攝像頭切換
步驟分析:
1.獲取當前的攝像頭位置狀態
- 是前置攝像頭還是后置攝像頭
2.設置我們需要改變的攝像頭的位置狀態.
- 如果是前置,那么就改成后置;如果是后置.那么就改成前置
3.根據我們新設置的攝像頭位置狀態來獲取改變后的攝像頭設備及輸入設備
4.移除之前的攝像頭設備.
5.添加新的攝像頭設備到會話中.
6.并跟新記錄
代碼示例
#pragma mark - 切換攝像頭
- (IBAction)SWAPMethod:(UIButton *)sender {
[self.avCaptureSession beginConfiguration];
// 1.獲取當前設備攝像頭位置
AVCaptureDevicePosition currentPosition = self.currentVideoDeviceInput.device.position;
// 2.獲取需要改變的方向
AVCaptureDevicePosition needChangePosition = currentPosition == AVCaptureDevicePositionFront ? AVCaptureDevicePositionBack : AVCaptureDevicePositionFront;
// 3.根據需要改變的方向來獲取攝像頭設備
AVCaptureDevice *needChangeDevice = [AVCaptureDevice defaultDeviceWithDeviceType:AVCaptureDeviceTypeBuiltInWideAngleCamera mediaType:AVMediaTypeVideo position:needChangePosition];
// 4.獲取新的攝像頭輸入設備
AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:needChangeDevice error:nil];
// 5.移除之前的攝像頭輸入設備
[self.avCaptureSession removeInput:self.currentVideoDeviceInput];
// 6.添加新的攝像頭輸入設備
[self.avCaptureSession addInput:deviceInput];
// 7.記錄當前攝像頭輸入設備
self.currentVideoDeviceInput = deviceInput;
[self.avCaptureSession commitConfiguration];
}
二.利用 GPUImage 框架實現攝像頭切換功能
只需調用一個方法
- -(void)rotateCamera;
// 譯 : 切換前后攝像頭
/** This flips between the front and rear cameras
*/
- (void)rotateCamera;
用這個方法就可以非常方便的切換攝像頭了!
下面是這個方法的實現:
- (void)rotateCamera
{
if (self.frontFacingCameraPresent == NO)
return;
NSError *error;
AVCaptureDeviceInput *newVideoInput;
AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position];
if (currentCameraPosition == AVCaptureDevicePositionBack)
{
currentCameraPosition = AVCaptureDevicePositionFront;
}
else
{
currentCameraPosition = AVCaptureDevicePositionBack;
}
AVCaptureDevice *backFacingCamera = nil;
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *device in devices)
{
if ([device position] == currentCameraPosition)
{
backFacingCamera = device;
}
}
newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:backFacingCamera error:&error];
if (newVideoInput != nil)
{
[_captureSession beginConfiguration];
[_captureSession removeInput:videoInput];
if ([_captureSession canAddInput:newVideoInput])
{
[_captureSession addInput:newVideoInput];
videoInput = newVideoInput;
}
else
{
[_captureSession addInput:videoInput];
}
//captureSession.sessionPreset = oriPreset;
[_captureSession commitConfiguration];
}
_inputCamera = backFacingCamera;
[self setOutputImageOrientation:_outputImageOrientation];
}
其實和我們用 AVFoundation 實現幾乎一樣.