[英]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.