繁体   English   中英

自定义摄像头视图切换摄像头前后

[英]custom camera view switch camera front back

我正在为我的应用程序使用自定义相机视图。 但是当我改变我的看法时,如果我没有改变,它就无法显示我的看法,如果我没有改变,它就会停止显示实时取景,然后它的工作就很好了,我不知道我尝试了很多错误或遗漏的东西。 我的代码是

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

如果我有任何错误,请看看并建议我

因此,我已经实现了自定义相机开关。 检查以下代码:

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

此代码在我工作时有效。 我发布此信息是因为它将对任何人都有帮助。

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

暂无
暂无

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

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