AVCameraInput - 从前向后切换相机时发生崩溃

时间:2015-03-03 16:37:10

标签: ios xcode avfoundation video-capture

我正在使用AV通过我的应用程序录制视频,并且我有一个按钮在摄像机视图之间交换前后摄像头,后面是默认设置。从后到前切换工作正常。但是,从前到后切换会导致应用程序崩溃。

- (IBAction)btnSwapCamerasClicked:(id)sender {

//Change camera source
if(session)
{
    //Indicate that some changes will be made to the session
    [session beginConfiguration];

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

    //Get new input
    AVCaptureDevice *newCamera = nil;
    if(((AVCaptureDeviceInput*)currentCameraInput).device.position == AVCaptureDevicePositionBack)
    {
        newCamera = [self cameraWithPosition:AVCaptureDevicePositionFront];
    }
    else
    {
        newCamera = [self cameraWithPosition:AVCaptureDevicePositionBack];
    }

    //Add input to session
    NSError *err = nil;
    AVCaptureDeviceInput *newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:newCamera error:&err];
    if(!newVideoInput || err)
    {
        NSLog(@"Error creating capture device input: %@", err.localizedDescription);
    }
    else
    {
          //THIS IS THE SPOT THAT CRASHES.
        [session addInput:newVideoInput];
    }

    //Commit all the configuration changes at once
    [session commitConfiguration];
}

}

崩溃发生在[session addInput:newVideoInput];并且我返回以下错误文本:

  

2015-03-03 11:25:59.566 SWAT App Beta [1769:365194] *由于未捕获的异常'NSInvalidArgumentException'终止应用,原因:'* 多个音频/视频AVCaptureInputs是目前不支持。'   ***第一次抛出调用堆栈:   (0x185c002d4 0x1975c80e4 0x1843ad39c 0x1843accd4 0x10004ac14 0x18a818fb4 0x18a80201c 0x18a818950 0x18a8185dc 0x18a811a74 0x18a7e57f0 0x18aa85274 0x18a7e3d04 0x185bb8250 0x185bb74f4 0x185bb55a4 0x185ae1404 0x18f4eb6fc 0x18a84a2b4 0x10004bb70 0x197c6ea08)   libc ++ abi.dylib:以NSException类型的未捕获异常终止

我不完全确定为什么似乎有多个输入,因为在我列出的代码中我删除了旧的输入,并且它适用于从前到后。不确定为什么从前到后让app自杀。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我通过重写将相机切换到我自己写的东西的代码来解决我的问题。我创建了一个名为currentCam的NSString,我将文本更改为" Back"和"前面"视目前情况而定。代码如下:

- (IBAction)btnSwapCamerasClicked:(id)sender {

[session beginConfiguration];


if ([currentCam isEqualToString:@"Back"])
{
    NSArray *inputs = [session inputs];

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

    //Video input
    AVCaptureDevice *newCamera = nil;
    newCamera = [self cameraWithPosition:AVCaptureDevicePositionFront];

    //Audio input
    AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
    AVCaptureDeviceInput * audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil];


    NSError *err = nil;
    AVCaptureDeviceInput *newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:newCamera error:&err];
    if(!newVideoInput || err)
    {
        NSLog(@"Error creating capture device input: %@", err.localizedDescription);
    }
    else
    {

        [session addInput:newVideoInput];
        [session addInput:audioInput];

        newVideoInput = nil;
        audioInput = nil;
        audioDevice = nil;
        newCamera = nil;
        inputs = nil;


    }

    currentCam = @"Front";


}
else if ([currentCam isEqualToString:@"Front"])
{
    NSArray *inputs = [session inputs];

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

    //Video input
    AVCaptureDevice *newCamera = nil;
    newCamera = [self cameraWithPosition:AVCaptureDevicePositionBack];

    //Audio input
    AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
    AVCaptureDeviceInput * audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil];


    NSError *err = nil;
    AVCaptureDeviceInput *newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:newCamera error:&err];
    if(!newVideoInput || err)
    {
        NSLog(@"Error creating capture device input: %@", err.localizedDescription);
    }
    else
    {

        [session addInput:newVideoInput];
        [session addInput:audioInput];

        newVideoInput = nil;
        audioInput = nil;
        audioDevice = nil;
        newCamera = nil;
        inputs = nil;
    }

    currentCam = @"Back";
}
else
{
    //Camera is some weird third camera that doesn't exist yet! :O
    NSLog(@"wat");
}

[session commitConfiguration];
}

答案 1 :(得分:1)

只有这么多代码才能运作

- (IBAction)switchCamera:(id)sender {

    [captureSession beginConfiguration];
    NSArray *inputs = [captureSession inputs];

    //Remove all inputs
    for (AVCaptureInput *input in inputs)
    {
        [captureSession removeInput:input];
    }

    //Video input
    AVCaptureDevice *newCamera = nil;
    if ([currentCam isEqualToString:@"Back"]){
        newCamera = [self cameraWithPosition:AVCaptureDevicePositionFront];
           currentCam = @"Front";
    }else{
        newCamera = [self cameraWithPosition:AVCaptureDevicePositionBack];
         currentCam = @"Back";
    }
    //Audio input
    AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
    AVCaptureDeviceInput * audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil];
    NSError *err = nil;

    AVCaptureDeviceInput *newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:newCamera error:&err];
    if(!newVideoInput || err)
    {
        NSLog(@"Error creating capture device input: %@", err.localizedDescription);
    }
    else
    {
        [captureSession addInput:newVideoInput];
        [captureSession addInput:audioInput];
    }
[captureSession commitConfiguration];
}