Beispiel #1
0
        private FrameGrabber(IFrameGrabberDataSource datasource = null, MediaCapture mediaCapture = null, MediaFrameSource mediaFrameSource = null, MediaFrameReader mediaFrameReader = null)
        {
            this.datasource       = datasource;
            this.mediaCapture     = mediaCapture;
            this.mediaFrameSource = mediaFrameSource;
            this.mediaFrameReader = mediaFrameReader;

            if (this.mediaFrameReader != null)
            {
                this.mediaFrameReader.FrameArrived += MediaFrameReader_FrameArrived;
            }
        }
Beispiel #2
0
        public static async Task <FrameGrabber> CreateAsync(IFrameGrabberDataSource datasource)
        {
            MediaCapture     mediaCapture     = null;
            MediaFrameReader mediaFrameReader = null;

            MediaFrameSourceGroup selectedGroup      = null;
            MediaFrameSourceInfo  selectedSourceInfo = null;

            // Pick first color source
            var groups = await MediaFrameSourceGroup.FindAllAsync();

            foreach (MediaFrameSourceGroup sourceGroup in groups)
            {
                foreach (MediaFrameSourceInfo sourceInfo in sourceGroup.SourceInfos)
                {
                    if (sourceInfo.SourceKind == MediaFrameSourceKind.Color)
                    {
                        selectedSourceInfo = sourceInfo;
                        break;
                    }
                }

                if (selectedSourceInfo != null)
                {
                    selectedGroup = sourceGroup;
                    break;
                }
            }

            // No valid camera was found. This will happen on the emulator.
            if (selectedGroup == null || selectedSourceInfo == null)
            {
                Debug.WriteLine("Failed to find Group and SourceInfo");
                return(new FrameGrabber());
            }

            // Create settings
            var settings = new MediaCaptureInitializationSettings
            {
                SourceGroup = selectedGroup,

                // This media capture can share streaming with other apps.
                SharingMode = MediaCaptureSharingMode.SharedReadOnly,

                // Only stream video and don't initialize audio capture devices.
                StreamingCaptureMode = StreamingCaptureMode.Video,

                // Set to CPU to ensure frames always contain CPU SoftwareBitmap images
                // instead of preferring GPU D3DSurface images.
                MemoryPreference = MediaCaptureMemoryPreference.Cpu,
            };

            // Create and initilize capture device
            mediaCapture = new MediaCapture();

            try
            {
                await mediaCapture.InitializeAsync(settings);
            }
            catch (Exception e)
            {
                Debug.WriteLine($"Failed to initilise mediacaptrue {e.ToString()}");
                return(new FrameGrabber());
            }

            MediaFrameSource selectedSource = mediaCapture.FrameSources[selectedSourceInfo.Id];

            // create new frame reader
            mediaFrameReader = await mediaCapture.CreateFrameReaderAsync(selectedSource);

            MediaFrameReaderStartStatus status = await mediaFrameReader.StartAsync();

            if (status == MediaFrameReaderStartStatus.Success)
            {
                Debug.WriteLine("MediaFrameReaderStartStatus == Success");
                return(new FrameGrabber(datasource, mediaCapture, selectedSource, mediaFrameReader));
            }
            else
            {
                Debug.WriteLine($"MediaFrameReaderStartStatus != Success; {status}");
                return(new FrameGrabber());
            }
        }