Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 自定义摄像机视图开关摄像机前后_Ios_Objective C_Xcode - Fatal编程技术网

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