1

Can't find an up-to-date answer on this:

- (void)viewDidLoad {
[super viewDidLoad];
AVCaptureSession *session = [[AVCaptureSession alloc] init];
session.sessionPreset = AVCaptureSessionPresetHigh;

AVCaptureDevice *device = [self frontCamera];

NSError *error = nil;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
[session addInput:input];

AVCaptureVideoPreviewLayer *newCaptureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
newCaptureVideoPreviewLayer.frame = self.view.bounds;

[self.view.layer addSublayer:newCaptureVideoPreviewLayer];
[self.view bringSubviewToFront:_logo];
[session startRunning];
}

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

The NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; is depreciated and is asking to use AVCaptureDeviceDiscoverySession. How can I correctly implement AVCaptureDeviceDiscoverySession to this code? I would just like to use the front camera. Thanks

Manesh
  • 528
  • 6
  • 20
  • Possible duplicate of [How to get front camera, back camera and audio with AVCaptureDeviceDiscoverySession](https://stackoverflow.com/questions/39894630/how-to-get-front-camera-back-camera-and-audio-with-avcapturedevicediscoverysess) – Yeheshuah Jun 18 '17 at 02:10

1 Answers1

0

You can access front camera by code blow.

- (AVCaptureDevice *)frontCamera {
    NSArray *devices;
    if (@available(iOS 10.0, *)) {
        AVCaptureDeviceDiscoverySession *session = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInTrueDepthCamera, AVCaptureDeviceTypeBuiltInWideAngleCamera] mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionFront];
        devices = session.devices;
    }else{
        devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
    }
    for (AVCaptureDevice *device in devices) {
        if ([device position] == AVCaptureDevicePositionFront) {
            return device;
        }
    }
    return nil;
}

According to Apple's docs:

AVCaptureDeviceDiscoverySession can find available capture devices currently as also as monitor availability of specified device. AVCaptureDeviceTypeBuiltInWideAngleCamera specify normal front camera. AVCaptureDeviceTypeBuiltInTrueDepthCamera specify depth front camera base infrared, which only available on iPhone X.

ooOlly
  • 1,997
  • 21
  • 31
  • Please note that `AVCaptureDeviceTypeBuiltInTrueDepthCamera` your answer mentions is only available on iOS 11.1 or newer. – Nick Gaens Aug 01 '18 at 09:22
  • In the given code, You are creating AVCaptureDeviceDiscoverySession object using AVCaptureDevicePositionFront parameter , then no need to iterate it again. – Shihab Dec 31 '19 at 18:32