From 36eeed78449e65cf29af38231b8ff1dab7b25e12 Mon Sep 17 00:00:00 2001 From: Niels Laute Date: Thu, 25 May 2023 15:13:15 +0200 Subject: [PATCH 01/11] Adding CameraHelper --- components/Helpers/samples/CameraHelper.md | 113 +++++++ .../Helpers/samples/CameraHelperSample.xaml | 43 +++ .../samples/CameraHelperSample.xaml.cs | 163 +++++++++ .../Helpers/src/CameraHelper/CameraHelper.cs | 308 ++++++++++++++++++ .../src/CameraHelper/CameraHelperResult.cs | 51 +++ .../src/CameraHelper/FrameEventArgs.cs | 51 +++ 6 files changed, 729 insertions(+) create mode 100644 components/Helpers/samples/CameraHelper.md create mode 100644 components/Helpers/samples/CameraHelperSample.xaml create mode 100644 components/Helpers/samples/CameraHelperSample.xaml.cs create mode 100644 components/Helpers/src/CameraHelper/CameraHelper.cs create mode 100644 components/Helpers/src/CameraHelper/CameraHelperResult.cs create mode 100644 components/Helpers/src/CameraHelper/FrameEventArgs.cs diff --git a/components/Helpers/samples/CameraHelper.md b/components/Helpers/samples/CameraHelper.md new file mode 100644 index 00000000..e68a53e7 --- /dev/null +++ b/components/Helpers/samples/CameraHelper.md @@ -0,0 +1,113 @@ +--- +title: CameraHelper +author: skommireddi +description: The CameraHelper provides helper methods to easily use the available camera frame sources to preview video, capture video frames and software bitmaps. +keywords: Helpers, CameraHelper, Camera, Frame Source, Video Frame, Software Bitmap +dev_langs: + - csharp +category: Helpers +subcategory: Layout +discussion-id: 0 +issue-id: 0 +--- + +# CameraHelper + +The **CameraHelper** provides helper methods to easily use the available camera frame sources to preview video, capture video frames and software bitmaps. The helper currently shows camera frame sources that support color video preview or video record streams. + +> [!IMPORTANT] +> Make sure you have the [webcam capability](/windows/uwp/packaging/app-capability-declarations#device-capabilities) enabled for your app to access the device's camera. + +> [!Sample CameraHelperSample] + +## Syntax + +```csharp +// Creates a Camera Helper and gets video frames from an available frame source. +using Microsoft.Toolkit.Uwp.Helpers.CameraHelper; + +CameraHelper _cameraHelper = new CameraHelper(); +var result = await _cameraHelper.InitializeAndStartCaptureAsync(); + +// Camera Initialization and Capture failed for some reason +if(result != CameraHelperResult.Success) +{ + // get error information + var errorMessage = result.ToString(); +} +else +{ + // Subscribe to get frames as they arrive + _cameraHelper.FrameArrived += CameraHelper_FrameArrived; +} + +private void CameraHelper_FrameArrived(object sender, FrameEventArgs e) +{ + // Gets the current video frame + VideoFrame currentVideoFrame = e.VideoFrame; + + // Gets the software bitmap image + SoftwareBitmap softwareBitmap = currentVideoFrame.SoftwareBitmap; +} +``` + + +## Cleaning up resources + +As a developer, you will need to make sure the CameraHelper resources are cleaned up when appropriate. For example, if the CameraHelper is only used on one page, make sure to clean up the CameraHelper when navigating away from the page. + +Likewise, make sure to handle app [suspending](/windows/uwp/launch-resume/suspend-an-app) and [resuming](/windows/uwp/launch-resume/resume-an-app) - CameraHelper should be cleaned up when suspending and re-initialized when resuming. + +Call `CameraHelper.CleanupAsync()` to clean up all internal resources. See the [CameraHelper sample page in the sample app](https://github.com/windows-toolkit/WindowsCommunityToolkit/tree/rel/7.1.0/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/CameraHelper) for full example. + +## Properties + +| Property | Type | Description | +| -- | -- | -- | +| FrameSourceGroup | MediaFrameSourceGroup | Gets the currently selected MediaFrameSourceGroup for video preview. User can set this property to preview video from a specific source. If no MediaFrameSourceGroup is provided, Camera Helper selects the first available camera source to use for media capture. | +| PreviewFrameSource | MediaFrameSource | Gets the currently selected MediaFrameSource for video preview. | + +## Methods + +| Methods | Return Type | Description | +| -- | -- | -- | +| GetFrameSourceGroupsAsync() | Task> | Gets a read only list of MediaFrameSourceGroups that support color video record or video preview streams. | +| InitializeAndStartCaptureAsync() | Task\ | Initializes Media Capture and Frame Reader for video preview and capture frames in real time. | +| CleanUpAsync() | Task | Use this asynchronous method to dispose Camera Helper resources | +| Dispose() | void | Use this method to dispose Camera Helper resources | + +## Events + +| Events | Description | +| -- | -- | +| FrameArrived| Fires when a new frame arrives.| + +## Examples + +Demonstrates using Camera Helper to get video frames from a specific media frame source group. + +```csharp + +using Microsoft.Toolkit.Uwp.Helpers.CameraHelper; + +var availableFrameSourceGroups = await CameraHelper.GetFrameSourceGroupsAsync(); +if(availableFrameSourceGroups != null) +{ + CameraHelper cameraHelper = new CameraHelper() { FrameSourceGroup = availableFrameSourceGroups.FirstOrDefault() }; + var result = await cameraHelper.InitializeAndStartCaptureAsync(); + + // Camera Initialization succeeded + if(result == CameraHelperResult.Success) + { + // Subscribe to get frames as they arrive + cameraHelper.FrameArrived += CameraHelper_FrameArrived; + + // Optionally set a different frame source format + var newFormat = cameraHelper.FrameFormatsAvailable.Find((format) => format.VideoFormat.Width == 640); + if (newFormat != null) + { + await cameraHelper.PreviewFrameSource.SetFormatAsync(newFormat); + } + } +} +``` diff --git a/components/Helpers/samples/CameraHelperSample.xaml b/components/Helpers/samples/CameraHelperSample.xaml new file mode 100644 index 00000000..2ec8a02d --- /dev/null +++ b/components/Helpers/samples/CameraHelperSample.xaml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + +