Esempio n. 1
0
        private void SetPinchGesture()
        {
            nfloat lastscale = 1.0f;

            Pinch = new UIPinchGestureRecognizer((e) =>
            {
                if (e.State == UIGestureRecognizerState.Changed)
                {
                    NSError device_error;
                    MainDevice.LockForConfiguration(out device_error);
                    if (device_error != null)
                    {
                        Console.WriteLine($"Error: {device_error.LocalizedDescription}");
                        MainDevice.UnlockForConfiguration();
                        return;
                    }
                    var scale = e.Scale + (1 - lastscale);
                    var zoom  = MainDevice.VideoZoomFactor * scale;
                    if (zoom > MaxZoom)
                    {
                        zoom = MaxZoom;
                    }
                    if (zoom < MinZoom)
                    {
                        zoom = MinZoom;
                    }
                    MainDevice.VideoZoomFactor = zoom;
                    MainDevice.UnlockForConfiguration();
                    lastscale = e.Scale;
                }
                else if (e.State == UIGestureRecognizerState.Ended)
                {
                    lastscale = 1.0f;
                }
            });
            this.AddGestureRecognizer(Pinch);
        }
        private void Initialize()
        {
            //Pinchジェスチャ登録
            SetPinchGesture();

            //デバイス設定
            var videoDevices   = AVCaptureDevice.DevicesWithMediaType(AVMediaType.Video);
            var cameraPosition = (cameraOptions == CameraOptions.Front) ? AVCaptureDevicePosition.Front : AVCaptureDevicePosition.Back;

            MainDevice = videoDevices.FirstOrDefault(d => d.Position == cameraPosition);

            NSError device_error;

            MainDevice.LockForConfiguration(out device_error);
            if (device_error != null)
            {
                Console.WriteLine($"Error: {device_error.LocalizedDescription}");
                MainDevice.UnlockForConfiguration();
                return;
            }
            //フレームレート設定
            MainDevice.ActiveVideoMinFrameDuration = new CMTime(1, 24);
            MainDevice.UnlockForConfiguration();

            if (MainDevice == null)
            {
                return;
            }

            //max zoom
            MaxZoom = (float)Math.Min(MainDevice.ActiveFormat.VideoMaxZoomFactor, 6);

            //入力設定
            NSError error;

            Input = new AVCaptureDeviceInput(MainDevice, out error);
            CaptureSession.AddInput(Input);

            //出力設定
            Output = new AVCaptureVideoDataOutput();

            //フレーム処理用
            Queue = new DispatchQueue("myQueue");
            Output.AlwaysDiscardsLateVideoFrames = true;
            Recorder = new OutputRecorder()
            {
                Camera = Camera
            };
            Output.SetSampleBufferDelegate(Recorder, Queue);
            var vSettings = new AVVideoSettingsUncompressed();

            vSettings.PixelFormatType = CVPixelFormatType.CV32BGRA;
            Output.WeakVideoSettings  = vSettings.Dictionary;

            CaptureSession.AddOutput(Output);

            if (IsPreviewing)
            {
                CaptureSession.StartRunning();
            }
        }