Beispiel #1
0
        protected override async void OnNavigatedTo(NavigationEventArgs e)
        {
            DisplayInformation.AutoRotationPreferences = DisplayOrientations.Landscape;

            //
            // Doing all that video processing is too much for low-end phones like the Lumia 520
            // Pick-and-choose which piece should run
            //

            VideoPreview.MediaFailed += VideoPreview_MediaFailed;
            //var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/video.cvmpilj.mjpg"));
            //var stream = await file.OpenAsync(FileAccessMode.Read);
            //var source = await HttpMjpegCaptureSource.CreateFromStreamAsync(stream, "myboundary");
            var source = await HttpMjpegCaptureSource.CreateFromUriAsync("http://216.123.238.208/axis-cgi/mjpg/video.cgi?camera&resolution=640x480");

            VideoPreview.SetMediaStreamSource(source.Source);

            var settings = new MediaCaptureInitializationSettings
            {
                StreamingCaptureMode = StreamingCaptureMode.Video
            };
            await settings.SelectVideoDeviceAsync(VideoDeviceSelection.BackOrFirst);

            _capture = new MediaCapture();
            await _capture.InitializeAsync(settings);

            var graphicsDevice = MediaGraphicsDevice.CreateFromMediaCapture(_capture);

            var previewProps = (VideoEncodingProperties)_capture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview);

            TextLog.Text += String.Format("Preview: {0} {1}x{2} {3}fps\n", previewProps.Subtype, previewProps.Width, previewProps.Height, previewProps.FrameRate.Numerator / (float)previewProps.FrameRate.Denominator);

            TextLog.Text += "Creating MediaSamplePresenter from SurfaceImageSource\n";

            var image = new SurfaceImageSource((int)previewProps.Width, (int)previewProps.Height);

            ImagePreview.Source = image;
            _imagePresenter     = ImagePresenter.CreateFromSurfaceImageSource(image, graphicsDevice, (int)previewProps.Width, (int)previewProps.Height);

            TextLog.Text += "Creating MediaSamplePresenter from SwapChainPanel\n";

            _swapChainPresenter = ImagePresenter.CreateFromSwapChainPanel(
                SwapChainPreview,
                graphicsDevice,
                (int)previewProps.Width,
                (int)previewProps.Height
                );

            TextLog.Text += "Creating MediaReader\n";

            _mediaReader = await MediaReader.CreateFromMediaCaptureAsync(_capture, AudioInitialization.Deselected, VideoInitialization.Bgra8);

            TextLog.Text += "Starting video loop\n";

            var ignore = Task.Run(() => VideoLoop());
        }
Beispiel #2
0
        private async Task InitializeCaptureAsync()
        {
            var settings = new MediaCaptureInitializationSettings
            {
                StreamingCaptureMode = StreamingCaptureMode.Video
            };
            await settings.SelectVideoDeviceAsync(VideoDeviceSelection.BackOrFirst);

            var capture = new MediaCapture();
            await capture.InitializeAsync(settings);

            // Select the capture resolution closest to screen resolution
            var formats = capture.VideoDeviceController.GetAvailableMediaStreamProperties(MediaStreamType.VideoPreview);
            var format  = (VideoEncodingProperties)formats.OrderBy((item) =>
            {
                var props = (VideoEncodingProperties)item;
                return(Math.Abs(props.Width - this.ActualWidth) + Math.Abs(props.Height - this.ActualHeight));
            }).First();
            await capture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.VideoPreview, format);

            // Make the SwapChainPanel full screen
            var scale = Math.Min(this.ActualWidth / format.Width, this.ActualHeight / format.Height);

            Preview.Width  = format.Width;
            Preview.Height = format.Height;
            Preview.RenderTransformOrigin = new Point(.5, .5);
            Preview.RenderTransform       = new ScaleTransform {
                ScaleX = scale, ScaleY = scale
            };
            BarcodeOutline.Width  = format.Width;
            BarcodeOutline.Height = format.Height;
            BarcodeOutline.RenderTransformOrigin = new Point(.5, .5);
            BarcodeOutline.RenderTransform       = new ScaleTransform {
                ScaleX = scale, ScaleY = scale
            };

            var reader = await MediaReader.CreateFromMediaCaptureAsync(capture, AudioInitialization.Deselected, VideoInitialization.Bgra8);

            var presenter = ImagePresenter.CreateFromSwapChainPanel(Preview, reader.GraphicsDevice, (int)format.Width, (int)format.Height);

            m_capture = capture;

            // Run preview/detection out of UI thread
            var ignore = Task.Run(async() =>
            {
                using (var barcodeReader = new VideoBarcodeReader())
                {
                    barcodeReader.SampleDecoded += barcodeReader_SampleDecoded;

                    while (true)
                    {
                        Logger.Events.VideoStream_ReadStart();
                        using (var result = await reader.VideoStream.ReadAsync())
                        {
                            Logger.Events.VideoStream_ReadStop();

                            if (result.Error)
                            {
                                break;
                            }

                            var sample = (MediaSample2D)result.Sample;
                            if (sample == null)
                            {
                                continue;
                            }

                            presenter.Present(sample);

                            barcodeReader.QueueSample(sample);
                            result.DetachSample();     // Sample ownership transferred to barcodeReader
                        }
                    }

                    barcodeReader.SampleDecoded -= barcodeReader_SampleDecoded;
                    reader.Dispose();
                    presenter.Dispose();
                }
            });
        }