Ios 自定义摄像机视图开关摄像机前后
我正在为我的应用程序使用自定义相机视图。但是当我改变我的观点时,它没有很好的反应,我看不到我的观点,无论发生什么变化,它停止显示实时视图,如果我不改变,那么它工作正常,我不知道我做了很多尝试,如果我犯了错或错过了什么。我的代码是Ios 自定义摄像机视图开关摄像机前后,ios,objective-c,xcode,Ios,Objective C,Xcode,我正在为我的应用程序使用自定义相机视图。但是当我改变我的观点时,它没有很好的反应,我看不到我的观点,无论发生什么变化,它停止显示实时视图,如果我不改变,那么它工作正常,我不知道我做了很多尝试,如果我犯了错或错过了什么。我的代码是 -(无效)abdbcam { 会话=[[AVCaptureSession alloc]init]; [会话设置会话预设:AVCaptureSessionPresetPhoto]; /*AVCaptureDevice*inputDevice=[AVCaptureDevi
-(无效)abdbcam
{
会话=[[AVCaptureSession alloc]init];
[会话设置会话预设:AVCaptureSessionPresetPhoto];
/*AVCaptureDevice*inputDevice=[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
n错误*错误;
AVCaptureDeviceInput*deviceInput=[AVCaptureDeviceInputDeviceInputWithDevice:InputDeviceError:&error];
if([会话canAddInput:deviceInput])
{
[会话附加输入:设备输入];
}*/
NSArray*设备=[AvCaptureDevices];
AVCaptureDevice*前置摄像头;
AVCaptureDevice*后置摄像头;
用于(AVCaptureDevice*设备中的设备)
{
NSLog(@“设备Nmae%@,[Device localizedName]);
if([设备hasMediaType:AVMediaTypeVideo])
{
if([设备位置]==AVCaptureDevicePositionBack)
{
NSLog(@“设备位置:背面”);
后摄像头=设备;
}
其他的
{
NSLog(@“设备位置:前”);
前置摄像头=设备;
}
}
}
如果(!前置摄像头)
{
n错误*错误=nil;
AVCaptureDeviceInput*输入=[AVCaptureDeviceInputDeviceInputWithDevice:backcamera错误:&错误];
如果(!输入)
{
NSLog(@“错误:尝试打开相机:%@”,错误);
}
[会话附加输入:输入];
}
if(前置摄像头){
n错误*错误=nil;
AVCaptureDeviceInput*输入=[AVCaptureDeviceInputDeviceInputWithDevice:frontcamera错误:&错误];
如果(!输入){
NSLog(@“错误:尝试打开相机:%@”,错误);
}
[会话附加输入:输入];
}
AVCaptureVideoPreviewLayer*previewLayer=[[AVCaptureVideoPreviewLayer alloc]initWithSession:session];
[previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
CALayer*rootLayer=[[self view]layer];
[rootLayer setMasksToBounds:YES];
CGRect frame=self.camerarole.frame;
[预览层设置帧:帧];
[根层插入子层:预览层索引:0];
stillImageOutput=[[AvCaptureSillImageOutput alloc]init];
NSDictionary*outputSetting=[[NSDictionary alloc]initWithObjectsAndKeys:AVVideoCodecJPEG,AVVideoCodecKey,nil];
[stillImageOutput setOutputSettings:outputSetting];
[session addOutput:stillImageOutput];
[会议开始和结束];
}
//现在我的段控制器代码是
-(iAction)开关摄像机:(id)发送器{
如果(cameraswitch.selectedSegmentIndex==0){
前摄像头=是;
[自身abdbcam];
}
如果(cameraswitch.selectedSegmentIndex==1){
[自身abdbcam];
}
所以我已经实现了自定义摄像头开关。请检查以下代码:
正在使用FrontFacing camera
也是一个布尔标志,用于检测您当前正在使用的摄像头
- (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;
}