繁体   English   中英

ios 切换摄像头前后分辨率改变 AVCaptureSessionPresetHigh

[英]ios switch camera front and back resolution is changed AVCaptureSessionPresetHigh

我使用 GPUImage lib,我的前置摄像头会话预设是 AVCaptureSessionPresetPhoto,后置摄像头是 AVCaptureSessionPresetHigh,

if (self.isFrontFacingCameraPresent) {
    [self setCaptureSessionPreset: AVCaptureSessionPresetHigh];
} else {
    [self setCaptureSessionPreset:AVCaptureSessionPresetPhoto];
}
[self rotateCamera];
  1. 初始状态为使用前置摄像头,分辨率为1280x960;

  2. 现在换了后置摄像头,分辨率为1920x1080;

  3. 然后换前置摄像头,分辨率是1280x720,很奇怪;

我检查了这个委托方法:

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

获取宽度和高度:

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

bufferHeight是720,我不明白为什么当改变后置前置摄像头时,高度从960变为720! 可能是苹果的bug?

我解决了这个问题,再见,改变rotateCamera函数,我重写了一个用于在前后切换相机的函数:

- (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];
    }
}

bufferHeight是720,我不明白为什么当改变后置前置摄像头时,高度从960变为720! 可能是苹果的bug?


当使用 AVCaptureSessionPresetHigh 时,实际分辨率与不同的相机不同,Front 和 Back 不同,它将获得相机的最高分辨率。 我猜你用的是iphone5。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM