相机在ios中没有变化

时间:2016-05-13 13:49:28

标签: ios avfoundation avcapturesession avcapturedevice

使用AVFoundation,我被困在从从后到前从前到后的更换相机。
为此我正在使用以下代码。

- (IBAction)CameraToggleButtonPressed:(id)sender
{
    if ([[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo] count] > 1)        
    {
        NSError *error;
        AVCaptureDeviceInput *NewVideoInput;
        AVCaptureDevicePosition position = [[VideoInputDevice device] position];
        if (position == AVCaptureDevicePositionBack)
        {
            NewVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:[self CameraWithPosition:AVCaptureDevicePositionFront] error:&error];
        }
        else if (position == AVCaptureDevicePositionFront)
        {
            NewVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:[self CameraWithPosition:AVCaptureDevicePositionBack] error:&error];
        }
        if (NewVideoInput != nil)
        {
            [CaptureSession beginConfiguration];                        [CaptureSession removeInput:VideoInputDevice];
            if ([CaptureSession canAddInput:NewVideoInput])
            {
                [CaptureSession addInput:NewVideoInput];
                VideoInputDevice = NewVideoInput;
            }
            else
            {
                [CaptureSession addInput:VideoInputDevice];
            }
            [self CameraSetOutputProperties];
            [CaptureSession commitConfiguration];
        }
    }
}

[CaptureSession canAddInput:NewVideoInput]总是返回false,因此相机不会改变。 我没有说明为什么会话无法添加新的输入设备。

请帮我解决这个问题。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

AVCaptureVideoPreviewLayer *captureVideoPreviewLayer;
bool isUsingFrontFacingCamera;

方法:

- (void) switchCam{

    if (![self cameraIsRunning])
        return;

    AVCaptureDevicePosition desiredPosition;

    if (isUsingFrontFacingCamera)
        desiredPosition = AVCaptureDevicePositionBack;
    else
        desiredPosition = AVCaptureDevicePositionFront;

    for (AVCaptureDevice *d in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]) {

        if ([d position] == desiredPosition) {

            [[captureVideoPreviewLayer session] beginConfiguration];

            AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:d error:nil];

            for (AVCaptureInput *oldInput in [[captureVideoPreviewLayer session] inputs]) {
                [[captureVideoPreviewLayer session] removeInput:oldInput];
            }

            [[captureVideoPreviewLayer session] addInput:input];
            [[captureVideoPreviewLayer session] commitConfiguration];

            break;
        }
    }

    isUsingFrontFacingCamera = !isUsingFrontFacingCamera;
}

- (bool) cameraIsRunning{

    return [session isRunning];
}