【问题标题】:Set front-facing camera in Xcode在 Xcode 中设置前置摄像头
【发布时间】:2012-06-03 10:49:36
【问题描述】:

在 Xcode 中设置前置摄像头。我怎样才能做到这一点? 在 Xcode 中设置前置摄像头。

AVCaptureSession *session = [AVCaptureSession new];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
    [session setSessionPreset:AVCaptureSessionPreset640x480];
else
    [session setSessionPreset:AVCaptureSessionPresetPhoto];

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
require( error == nil, bail );

isUsingFrontFacingCamera = NO;
if ( [session canAddInput:deviceInput] )
    [session addInput:deviceInput];

stillImageOutput = [AVCaptureStillImageOutput new];
[stillImageOutput addObserver:self forKeyPath:@"capturingStillImage" options:NSKeyValueObservingOptionNew context:AVCaptureStillImageIsCapturingStillImageContext];
if ( [session canAddOutput:stillImageOutput] )
    [session addOutput:stillImageOutput];

【问题讨论】:

    标签: iphone ios camera avfoundation


    【解决方案1】:

    添加此方法以遍历现有设备检查其位置:

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

    然后,替换:

    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    

    与:

    AVCaptureDevice *device = [self frontCamera];
    

    【讨论】:

    • 我们如何通过按钮的动作来做到这一点。即在按钮的动作上切换相机
    • 更好的建议。
    • "添加此方法以遍历现有设备检查其位置:" ...将其放在哪里?
    • 其实前置摄像头应该是镜像的。
    • devicesWithMediaTypes 已弃用,将设备数组替换为:AVCaptureDeviceDiscoverySession *captureDeviceDiscoverySession = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera] mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionFront]; NSArray *devices = [captureDeviceDiscoverySession devices];
    【解决方案2】:
    **.h file
    @interface ViewController : UIViewController<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
    .m File
    -(IBAction)Btn_Ok:(id)sender
    {
     if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
                {
                    UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:@"Error"
                                                                          message:@"Device has no camera"
                                                                         delegate:nil
                                                                cancelButtonTitle:@"OK"
                                                                otherButtonTitles: nil];
                    [myAlertView show];
                }
                else
                {
                    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
                    picker.delegate = self;
                    picker.allowsEditing = YES;
                    picker.sourceType = UIImagePickerControllerSourceTypeCamera;
                    picker.cameraDevice=UIImagePickerControllerCameraDeviceFront;
                    [self presentViewController:picker animated:YES completion:NULL];
                }
    }
    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
    {
        UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
        self.yourimg.image = chosenImage;
        [picker dismissViewControllerAnimated:YES completion:NULL];
    }
    - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
    {
        [picker dismissViewControllerAnimated:YES completion:NULL];
    }
    

    【讨论】:

      【解决方案3】:

      由于 iOS 10 devicesWithMediaType: 已弃用。你应该使用AVCAptureDeviceDiscoverySession

      - (AVCaptureDevice *)frontCamera {    
          return [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[ AVCaptureDeviceTypeBuiltInWideAngleCamera ]
                                                                        mediaType:AVMediaTypeVideo
                                                                         position:AVCaptureDevicePositionFront].devices.firstObject;
      }
      

      【讨论】:

      • 前置摄像头也是广角摄像头吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 2018-02-14
      • 2016-03-06
      • 1970-01-01
      相关资源
      最近更新 更多