Switch cameras with avcapturesession

后端 未结 6 1693
借酒劲吻你
借酒劲吻你 2020-11-28 08:06

Using this tutorial here: http://www.musicalgeometry.com/?p=1297 I have created a custom overlay and image capture with AVCaptureSession.

I am attemptin

6条回答
  •  情话喂你
    2020-11-28 08:19

    Based on previous answers I made my own version with some validations and one specific change, the current camera input might not be the first object of the capture session's inputs, so I changed this:

    //Remove existing input
    AVCaptureInput* currentCameraInput = [self.captureSession.inputs objectAtIndex:0];
    [self.captureSession removeInput:currentCameraInput];
    

    To this (removing all video type inputs):

    for (AVCaptureDeviceInput *input in self.captureSession.inputs) {
        if ([input.device hasMediaType:AVMediaTypeVideo]) {
            [self.captureSession removeInput:input];
            break;
        }
    }
    

    Here's the entire code:

    if (!self.captureSession) return;
    
    [self.captureSession beginConfiguration];
    
    AVCaptureDeviceInput *currentCameraInput;
    
    // Remove current (video) input
    for (AVCaptureDeviceInput *input in self.captureSession.inputs) {
        if ([input.device hasMediaType:AVMediaTypeVideo]) {
            [self.captureSession removeInput:input];
    
            currentCameraInput = input;
            break;
        }
    }
    
    if (!currentCameraInput) return;
    
    // Switch device position
    AVCaptureDevicePosition captureDevicePosition = AVCaptureDevicePositionUnspecified;
    if (currentCameraInput.device.position == AVCaptureDevicePositionBack) {
        captureDevicePosition = AVCaptureDevicePositionFront;
    } else {
        captureDevicePosition = AVCaptureDevicePositionBack;
    }
    
    // Select new camera
    AVCaptureDevice *newCamera;
    NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
    
    for (AVCaptureDevice *captureDevice in devices) {
        if (captureDevice.position == captureDevicePosition) {
            newCamera = captureDevice;
        }
    }
    
    if (!newCamera) return;
    
    // Add new camera input
    NSError *error;
    AVCaptureDeviceInput *newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:newCamera error:&error];
    if (!error && [self.captureSession canAddInput:newVideoInput]) {
        [self.captureSession addInput:newVideoInput];
    }
    
    [self.captureSession commitConfiguration];
    

提交回复
热议问题