Search code examples
ioscameragpuimage

ios switch camera front and back resolution is changed AVCaptureSessionPresetHigh


I used GPUImage lib, my front camera session preset is AVCaptureSessionPresetPhoto, back camera is AVCaptureSessionPresetHigh,

if (self.isFrontFacingCameraPresent) {
    [self setCaptureSessionPreset: AVCaptureSessionPresetHigh];
} else {
    [self setCaptureSessionPreset:AVCaptureSessionPresetPhoto];
}
[self rotateCamera];
  1. The initial status is using front camera, the resolution is 1280x960;

  2. Now changed back camera, the resolution is 1920x1080;

  3. Then change front camera, the resolution is 1280x720, it's very strange;

I checked this delegate method:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection

fetched the width and height:

    CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(sampleBuffer);
    int bufferWidth = (int) CVPixelBufferGetWidth(cameraFrame);
    int bufferHeight = (int) CVPixelBufferGetHeight(cameraFrame);

The bufferHeight is 720, I don't why when changed back front camera, the height changed from 960 to 720! Maybe it's apple's bug?


Solution

  • I solved the issue, bye change the rotateCamera function, I rewrite a function used to switch camera between front and back:

    - (void)switchCameraFrontAndBack {
    
        NSError *error;
        AVCaptureDeviceInput *newVideoInput;
        AVCaptureDevicePosition currentCameraPosition = self.cameraPosition;
    
        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];
            [self configSessionPreset:currentCameraPosition];
            if ([_captureSession canAddInput:newVideoInput])
            {
                [_captureSession addInput:newVideoInput];
                videoInput = newVideoInput;
            }
            else
            {
                [_captureSession addInput:videoInput];
            }
            [_captureSession commitConfiguration];
        }
    
        _inputCamera = backFacingCamera;
        [self setOutputImageOrientation:self.outputImageOrientation];
    }
    
    - (void)configSessionPreset:(AVCaptureDevicePosition)currentPosition {
        if (currentPosition == AVCaptureDevicePositionBack) {
            if (WIDTH <= Iphone4SWidth) {
                if ([self.captureSession canSetSessionPreset:AVCaptureSessionPreset1280x720]) {
                    [self setCaptureSessionPreset:AVCaptureSessionPreset1280x720];
                } else if ([self.captureSession canSetSessionPreset:AVCaptureSessionPreset1920x1080]) {
                    [self setCaptureSessionPreset:AVCaptureSessionPreset1920x1080];
                }
            } else {
                if ([self.captureSession canSetSessionPreset:AVCaptureSessionPreset1920x1080]) {
                    [self setCaptureSessionPreset:AVCaptureSessionPreset1920x1080];
                } else {
                    [self setCaptureSessionPreset: AVCaptureSessionPresetHigh];
                }
            }
        } else {
            [self setCaptureSessionPreset:AVCaptureSessionPresetPhoto];
        }
    }