Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ios开关相机前后分辨率已更改AVCaptureSessionPresetHigh_Ios_Camera_Gpuimage - Fatal编程技术网

ios开关相机前后分辨率已更改AVCaptureSessionPresetHigh

ios开关相机前后分辨率已更改AVCaptureSessionPresetHigh,ios,camera,gpuimage,Ios,Camera,Gpuimage,我使用的是GPUImage库,我的前置摄像头会话预设为AVCaptureSessionPresetPhoto,后置摄像头为AVCaptureSessionPresetHigh if (self.isFrontFacingCameraPresent) { [self setCaptureSessionPreset: AVCaptureSessionPresetHigh]; } else { [self setCaptureSessionPreset:AVCaptureSession

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

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

  • 现在换了后置摄像头,分辨率是1920x1080

  • 然后换个前置摄像头,分辨率是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);
    

    缓冲区的高度是720,我不知道为什么更换前后摄像头时,高度从960变为720!可能是苹果的错误?

    我解决了这个问题,通过更改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];
        }
    }
    
    -(无效)前后切换摄像头{
    n错误*错误;
    AVCaptureDeviceInput*新视频输入;
    AVCaptureDevicePosition currentCameraPosition=self.cameraPosition;
    if(currentCameraPosition==AVCaptureDevicePositionBack)
    {
    currentCameraPosition=AVCaptureDevicePositionFront;
    }
    其他的
    {
    currentCameraPosition=AVCaptureDevicePositionBack;
    }
    AVCaptureDevice*背面摄像头=零;
    NSArray*设备=[AVCaptureDevicesWithMediaType:AVMediaTypeVideo];
    用于(AVCaptureDevice*设备中的设备)
    {
    如果([设备位置]==currentCameraPosition)
    {
    背面照相机=装置;
    }
    }
    newVideoInput=[[AvCaptureDeviceInputAlloc]initWithDevice:BackpacingCamera错误:&错误];
    if(newVideoInput!=nil)
    {
    [[捕获会话开始配置];
    [\u captureSession removeInput:videoInput];
    [自配置会话预设:currentCameraPosition];
    if([[U captureSession canAddInput:newVideoInput])
    {
    [\u captureSession addInput:newVideoInput];
    videoInput=新的videoInput;
    }
    其他的
    {
    [\u captureSession addInput:videoInput];
    }
    [_CaptureSessionCommitteConfiguration];
    }
    _输入摄像机=背面摄像机;
    [self-setOutputImageOrientation:self.outputImageOrientation];
    }
    -(无效)配置会话预设:(AVCaptureDevicePosition)当前位置{
    if(currentPosition==AVCaptureDevicePositionBack){
    
    如果(宽度高度是720,我不知道为什么更换前后摄像头时,高度从960变为720!可能是苹果的错误


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