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; } }
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()); } }