protected void Initialize() { CaptureSession = new AVCaptureSession(); _previewLayer = new AVCaptureVideoPreviewLayer(CaptureSession) { Frame = Bounds, VideoGravity = AVLayerVideoGravity.ResizeAspectFill }; AVCaptureDeviceType[] captureDevices = { AVCaptureDeviceType.BuiltInWideAngleCamera }; var cameraPosition = (_cameraOptions == CameraOptions.Front) ? AVCaptureDevicePosition.Front : AVCaptureDevicePosition.Back; var videoDevices = AVCaptureDeviceDiscoverySession.Create(captureDevices, AVMediaType.Video, cameraPosition); var device = videoDevices.Devices.FirstOrDefault(); if (device == null) { return; } var input = new AVCaptureDeviceInput(device, out NSError error); CaptureSession.AddInput(input); Layer.AddSublayer(_previewLayer); CaptureSession.StartRunning(); IsPreviewing = true; }
void UpdateCameraOption() { var devices = AVCaptureDeviceDiscoverySession.Create( new AVCaptureDeviceType[] { AVCaptureDeviceType.BuiltInWideAngleCamera, AVCaptureDeviceType.BuiltInDualCamera }, AVMediaType.Video, AVCaptureDevicePosition.Unspecified ); var cameraPosition = (cameraOptions == CameraOptions.Front) ? AVCaptureDevicePosition.Front : AVCaptureDevicePosition.Back; var device = devices.Devices.FirstOrDefault(d => d.Position == cameraPosition); if (device != null) { var lVideoDeviceInput = AVCaptureDeviceInput.FromDevice(device); captureSession.BeginConfiguration(); // Remove the existing device input first, since using the front and back camera simultaneously is not supported. captureSession.RemoveInput(videoDeviceInput); if (captureSession.CanAddInput(lVideoDeviceInput)) { captureSession.AddInput(lVideoDeviceInput); videoDeviceInput = lVideoDeviceInput; } else { captureSession.AddInput(videoDeviceInput); } captureSession.CommitConfiguration(); } }
//Function that discovers the device's back camera and returns an AVCaptureDevice object to // ConfigureDeviceAndStart() where it is called below. public AVCaptureDevice GetDevice() { var videoDeviceDiscoverySession = AVCaptureDeviceDiscoverySession.Create(new AVCaptureDeviceType[] { AVCaptureDeviceType.BuiltInWideAngleCamera }, AVMediaType.Video, AVCaptureDevicePosition.Back); return(videoDeviceDiscoverySession.Devices.FirstOrDefault()); }
void SetupVideoInput() { // Video Input var videoDevices = AVCaptureDeviceDiscoverySession.Create( new AVCaptureDeviceType[] { AVCaptureDeviceType.BuiltInWideAngleCamera, AVCaptureDeviceType.BuiltInDualCamera }, AVMediaType.Video, AVCaptureDevicePosition.Unspecified ); var cameraPosition = (cameraOptions == CameraOptions.Front) ? AVCaptureDevicePosition.Front : AVCaptureDevicePosition.Back; var device = videoDevices.Devices.FirstOrDefault(d => d.Position == cameraPosition); if (device == null) { return; } ConfigureCameraForDevice(device); NSError error; videoDeviceInput = new AVCaptureDeviceInput(device, out error); captureSession.AddInput(videoDeviceInput); }
public void SetupCamera() { var deviceDiscovery = AVCaptureDeviceDiscoverySession.Create( new AVCaptureDeviceType[] { AVCaptureDeviceType.BuiltInWideAngleCamera }, AVMediaType.Video, AVCaptureDevicePosition.Back); var device = deviceDiscovery.Devices.LastOrDefault(); if (device != null) { captureDevice = device; BeginSession(); } }
public static int UniqueDevicePositionsCount(this AVCaptureDeviceDiscoverySession session) { var uniqueDevicePositions = new List <AVCaptureDevicePosition>(); foreach (AVCaptureDevice device in session.Devices) { if (!uniqueDevicePositions.Contains(device.Position)) { uniqueDevicePositions.Add(device.Position); } } return(uniqueDevicePositions.Count); }
public AVCamCameraView() { #region UIVIew adds session = new AVCaptureSession(); VideoPreviewLayer = new AVCaptureVideoPreviewLayer(session) { Frame = Bounds, VideoGravity = AVLayerVideoGravity.ResizeAspectFill }; var videoDevices = AVCaptureDevice.DevicesWithMediaType(AVMediaType.Video); var cameraPosition = (cameraOptions == CameraOptions.Front) ? AVCaptureDevicePosition.Front : AVCaptureDevicePosition.Back; var device = videoDevices.FirstOrDefault(d => d.Position == cameraPosition); if (device == null) { return; } NSError error; var input = new AVCaptureDeviceInput(device, out error); session.AddInput(input); Layer.AddSublayer(VideoPreviewLayer); //session.StartRunning(); IsPreviewing = true; #endregion // Create a device discovery session. videoDeviceDiscoverySession = AVCaptureDeviceDiscoverySession.Create( new AVCaptureDeviceType[] { AVCaptureDeviceType.BuiltInWideAngleCamera, AVCaptureDeviceType.BuiltInDualCamera }, AVMediaType.Video, AVCaptureDevicePosition.Unspecified ); // Communicate with the session and other session objects on this queue. sessionQueue = new DispatchQueue("session queue", false); setupResult = AVCamSetupResult.Success; }
private void SetupCamera(bool restart = false) { try { if (_captureSession == null || restart) { _captureSession = new AVCaptureSession { SessionPreset = AVCaptureSession.PresetPhoto }; if (!_cameraModule.AvailableCameras.Any()) { var deviceTypes = new List <AVCaptureDeviceType> { AVCaptureDeviceType.BuiltInWideAngleCamera, AVCaptureDeviceType.BuiltInTelephotoCamera }; if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0)) { deviceTypes.Add(AVCaptureDeviceType.BuiltInUltraWideCamera); } var session = AVCaptureDeviceDiscoverySession.Create( deviceTypes.ToArray(), AVMediaType.Video, AVCaptureDevicePosition.Unspecified); _devices = session.Devices; foreach (var avCaptureDevice in _devices) { _cameraModule.AvailableCameras.Add(new AvailableCamera { DisplayName = avCaptureDevice.LocalizedName, CameraId = avCaptureDevice.UniqueID, IsFront = avCaptureDevice.Position == AVCaptureDevicePosition.Front }); } } } SetPreviewOrientation(); if (_device == null) { _device = AVCaptureDevice.GetDefaultDevice(AVMediaTypes.Video); _cameraModule.ChosenCamera = _cameraModule.AvailableCameras.First(c => c.CameraId == _device.UniqueID); } else { _device = AVCaptureDevice.DeviceWithUniqueID(_cameraModule.ChosenCamera.CameraId); } SetPreviewSizing(_device, restart); TurnOffFlashAndSetContinuousAutoMode(_device); _is10OrHigher = UIDevice.CurrentDevice.CheckSystemVersion(10, 0); var isRestart = false; if (_is10OrHigher && (_photoOutput == null || restart)) { _photoOutput = new AVCapturePhotoOutput { IsHighResolutionCaptureEnabled = true }; _captureSession.AddOutput(_photoOutput); isRestart = true; } else if (!_is10OrHigher && (_stillImageOutput == null || restart)) { _stillImageOutput = new AVCaptureStillImageOutput { OutputSettings = new NSDictionary(), HighResolutionStillImageOutputEnabled = true }; _captureSession.AddOutput(_stillImageOutput); isRestart = true; } if (isRestart) { var settings = new AVVideoSettingsUncompressed { PixelFormatType = CVPixelFormatType.CV32BGRA }; _previewFrameOutput = new AVCaptureVideoDataOutput { AlwaysDiscardsLateVideoFrames = true, MinFrameDuration = new CMTime(1, 30), UncompressedVideoSetting = settings }; //if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0)) //TODO: what is this? //{ // _previewFrameOutput.DeliversPreviewSizedOutputBuffers = true; // _previewFrameOutput.AutomaticallyConfiguresOutputBufferDimensions = false; //} _previewFrameDelegate = new PreviewFrameDelegate(_cameraModule); var queue = new DispatchQueue("PreviewFrameQueue"); _previewFrameOutput.WeakVideoSettings = settings.Dictionary; _previewFrameOutput.SetSampleBufferDelegate(_previewFrameDelegate, queue); _captureSession.AddOutput(_previewFrameOutput); _captureSession.AddInput(AVCaptureDeviceInput.FromDevice(_device)); } _device.AddObserver(this, "adjustingFocus", NSKeyValueObservingOptions.OldNew, IntPtr.Zero); } catch (Exception e) { _cameraModule.ErrorMessage = e.ToString(); } }
static int UniqueDevicePositionsCount (AVCaptureDeviceDiscoverySession session) { var uniqueDevicePositions = new List<AVCaptureDevicePosition> (); foreach (var device in session.Devices) { if (!uniqueDevicePositions.Contains (device.Position)) uniqueDevicePositions.Add (device.Position); } return uniqueDevicePositions.Count; }
protected virtual void SetupAVCapture() { AVCaptureDeviceInput deviceInput; // Select a video device, make an input var videoDevice = AVCaptureDeviceDiscoverySession.Create( new AVCaptureDeviceType[] { AVCaptureDeviceType.BuiltInWideAngleCamera }, AVMediaType.Video, AVCaptureDevicePosition.Back ).Devices.FirstOrDefault(); deviceInput = new AVCaptureDeviceInput(videoDevice, out NSError error); if (error != null) { Console.WriteLine($"Could not create video device input: {error.LocalizedDescription}"); return; } session.BeginConfiguration(); session.SessionPreset = AVCaptureSession.Preset640x480; // Model image size is smaller // Add a video input if (!session.CanAddInput(deviceInput)) { Console.WriteLine("Could not add video device input to the session"); session.CommitConfiguration(); return; } session.AddInput(deviceInput); if (session.CanAddOutput(videoDataOutput)) { session.AddOutput(videoDataOutput); // Add a video data ouptut videoDataOutput.AlwaysDiscardsLateVideoFrames = true; videoDataOutput.WeakVideoSettings = new NSDictionary(CVPixelBuffer.PixelFormatTypeKey, CVPixelFormatType.CV420YpCbCr8BiPlanarFullRange); videoDataOutput.SetSampleBufferDelegateQueue(this, videoDataOutputQueue); } else { Console.WriteLine("Could not add video data output to the session"); session.CommitConfiguration(); return; } var captureConnection = videoDataOutput.ConnectionFromMediaType(AVMediaType.Video); // Always process the frames captureConnection.Enabled = true; videoDevice.LockForConfiguration(out NSError error2); if (error2 == null) { var formatDescription = videoDevice.ActiveFormat.FormatDescription as CMVideoFormatDescription; CMVideoDimensions dimensions = formatDescription.Dimensions; bufferSize.Width = dimensions.Width; bufferSize.Height = dimensions.Height; videoDevice.UnlockForConfiguration(); } else { Console.WriteLine($"{error2.LocalizedDescription}"); } session.CommitConfiguration(); previewLayer = AVCaptureVideoPreviewLayer.FromSession(session); previewLayer.VideoGravity = AVLayerVideoGravity.ResizeAspectFill; rootLayer = previewView.Layer; previewLayer.Frame = rootLayer.Bounds; rootLayer.AddSublayer(previewLayer); }