简体   繁体   中英

custom camera view switch camera front back

i am using custom camera view for my app. but when i am changing my view its not responding well i can't able to see my view whatever changes its stop showing live view if i am not changing then its working just fine ,i don`t know i try alot were i am doing mistake or missing something. my code is

 -(void)abdbcam { session=[[AVCaptureSession alloc]init]; [session setSessionPreset:AVCaptureSessionPresetPhoto]; /* AVCaptureDevice *inputDevice=[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; NSError *error; AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:&error]; if([session canAddInput:deviceInput]) { [session addInput:deviceInput]; }*/ NSArray *devices = [AVCaptureDevice devices]; AVCaptureDevice *frontcamera; AVCaptureDevice *backcamera; for (AVCaptureDevice *device in devices) { NSLog(@"Device Nmae %@",[device localizedName]); if ([device hasMediaType:AVMediaTypeVideo]) { if ([device position] == AVCaptureDevicePositionBack) { NSLog(@"device position: bAck"); backcamera = device; } else { NSLog(@"device position : front"); frontcamera = device; } } } if (!FrontCamera) { NSError *error = nil; AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:backcamera error:&error]; if (!input) { NSLog(@"error: trying to open camera: %@", error); } [session addInput:input]; } if (FrontCamera) { NSError *error = nil; AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:frontcamera error:&error]; if (!input) { NSLog(@"error: trying to open camera: %@", error); } [session addInput:input]; } AVCaptureVideoPreviewLayer *previewLayer=[[AVCaptureVideoPreviewLayer alloc]initWithSession:session]; [previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; CALayer *rootLayer = [[self view]layer]; [rootLayer setMasksToBounds:YES]; CGRect frame=self.camerarole.frame; [previewLayer setFrame:frame]; [rootLayer insertSublayer:previewLayer atIndex:0]; stillImageOutput=[[AVCaptureStillImageOutput alloc]init]; NSDictionary *outputSetting=[[NSDictionary alloc]initWithObjectsAndKeys:AVVideoCodecJPEG,AVVideoCodecKey, nil]; [stillImageOutput setOutputSettings:outputSetting]; [session addOutput:stillImageOutput]; [session startRunning]; } // now my segment controller code is - (IBAction)switchcamera:(id)sender { if (cameraswitch.selectedSegmentIndex == 0) { FrontCamera = YES; [self abdbcam]; } if (cameraswitch.selectedSegmentIndex == 1) { [self abdbcam]; } 

please have a look and suggest me if i am doing any mistake

So I've already implemented custom camera switch. Check this code below:

isUsingFrontFacingCamera is a bool flag, too detect which camera are you using at the moment

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

This code worked for while i am working. i am posting this because it will be helpful for anyone.

NSArray *inputs = session.inputs;
for ( AVCaptureDeviceInput *input in inputs ) {
    AVCaptureDevice *device = input.device;
    if ( [device hasMediaType:AVMediaTypeVideo] ) {
        AVCaptureDevicePosition position = device.position;
        AVCaptureDevice *newCamera = nil;
        AVCaptureDeviceInput *newInput = nil;

        if (position == AVCaptureDevicePositionFront)
            newCamera = [self cameraWithPosition:AVCaptureDevicePositionBack];
        else
            newCamera = [self cameraWithPosition:AVCaptureDevicePositionFront];
        newInput = [AVCaptureDeviceInput deviceInputWithDevice:newCamera error:nil];

        // beginConfiguration ensures that pending changes are not applied immediately
        [session beginConfiguration];

        [session removeInput:input];
        [session addInput:newInput];

        // Changes take effect once the outermost commitConfiguration is invoked.
        [session commitConfiguration];
        break;
    }
}


- (AVCaptureDevice *)cameraWithPosition:(AVCaptureDevicePosition)position
 {
   NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
    for ( AVCaptureDevice *device in devices )
    if ( device.position == position )
        return device;
    return nil;
 }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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