void ConfigureSession ()
{
if (setupResult != AVCamSetupResult.Success)
return;
session.BeginConfiguration ();
// We do not create an AVCaptureMovieFileOutput when setting up the session because the
// AVCaptureMovieFileOutput does not support movie recording with AVCaptureSessionPresetPhoto.
session.SessionPreset = AVCaptureSession.PresetPhoto;
// Add video input.
// Choose the back dual camera if available, otherwise default to a wide angle camera.
AVCaptureDevice defaultVideoDevice = AVCaptureDevice.GetDefaultDevice (AVCaptureDeviceType.BuiltInDuoCamera, AVMediaType.Video, AVCaptureDevicePosition.Back)
?? AVCaptureDevice.GetDefaultDevice (AVCaptureDeviceType.BuiltInWideAngleCamera, AVMediaType.Video, AVCaptureDevicePosition.Back)
?? AVCaptureDevice.GetDefaultDevice (AVCaptureDeviceType.BuiltInWideAngleCamera, AVMediaType.Video, AVCaptureDevicePosition.Front);
NSError error;
var input = AVCaptureDeviceInput.FromDevice (defaultVideoDevice, out error);
if (error != null) {
Console.WriteLine ($"Could not create video device input: {error.LocalizedDescription}");
setupResult = AVCamSetupResult.SessionConfigurationFailed;
session.CommitConfiguration ();
return;
}
if (session.CanAddInput (input)) {
session.AddInput (input);
videoDeviceInput = input;
DispatchQueue.MainQueue.DispatchAsync (() => {
// Why are we dispatching this to the main queue?
// Because AVCaptureVideoPreviewLayer is the backing layer for PreviewView and UIView
// can only be manipulated on the main thread.
// Note: As an exception to the above rule, it is not necessary to serialize video orientation changes
// on the AVCaptureVideoPreviewLayer’s connection with other session manipulation.
// Use the status bar orientation as the initial video orientation. Subsequent orientation changes are handled by
// ViewWillTransitionToSize method.
var statusBarOrientation = UIApplication.SharedApplication.StatusBarOrientation;
var initialVideoOrientation = AVCaptureVideoOrientation.Portrait;
AVCaptureVideoOrientation videoOrientation;
if (statusBarOrientation != UIInterfaceOrientation.Unknown && TryConvertToVideoOrientation(statusBarOrientation, out videoOrientation))
initialVideoOrientation = videoOrientation;
PreviewView.VideoPreviewLayer.Connection.VideoOrientation = initialVideoOrientation;
});
} else {
Console.WriteLine ("Could not add video device input to the session");
setupResult = AVCamSetupResult.SessionConfigurationFailed;
session.CommitConfiguration ();
return;
}
// Add audio input.
var audioDevice = AVCaptureDevice.DefaultDeviceWithMediaType (AVMediaType.Audio);
var audioDeviceInput = AVCaptureDeviceInput.FromDevice (audioDevice, out error);
if (error != null)
Console.WriteLine ($"Could not create audio device input: {error.LocalizedDescription}");
if (session.CanAddInput (audioDeviceInput))
session.AddInput (audioDeviceInput);
else
Console.WriteLine ("Could not add audio device input to the session");
// Add photo output.
if (session.CanAddOutput (photoOutput)) {
session.AddOutput (photoOutput);
photoOutput.IsHighResolutionCaptureEnabled = true;
photoOutput.IsLivePhotoCaptureEnabled = photoOutput.IsLivePhotoCaptureSupported;
livePhotoMode = photoOutput.IsLivePhotoCaptureSupported ? LivePhotoMode.On : LivePhotoMode.Off;
} else {
Console.WriteLine ("Could not add photo output to the session");
setupResult = AVCamSetupResult.SessionConfigurationFailed;
session.CommitConfiguration ();
return;
}
session.CommitConfiguration ();
}