Acceso a la vista previa de la cámara con MediaCapture

En este artículo se muestra cómo mostrar la secuencia de vista previa de la cámara en una aplicación de escritorio winUI 3, controlar escenarios de control exclusivos y administrar eventos de ciclo de vida de la aplicación. Para ver un inicio rápido que cubre los aspectos básicos de la visualización de una vista previa de la cámara, consulte Mostrar la vista previa de la cámara en una aplicación WinUI.

Mostrar la vista previa de la cámara

En WinUI 3, usas MediaPlayerElement para mostrar la vista previa de la cámara. El control para UWP CaptureElement no está disponible en WinUI 3.

Agregue un elemento MediaPlayerElement a la página XAML:

<MediaPlayerElement x:Name="PreviewElement"
                    AutoPlay="True"
                    HorizontalAlignment="Stretch" />

Inicializar MediaCapture

Cree una instancia de MediaCapture e inicialícela con la configuración deseada. Puede especificar un dispositivo de cámara determinado estableciendo VideoDeviceId.

using Windows.Media.Capture;
using Windows.Devices.Enumeration;

private MediaCapture _mediaCapture;

private async Task InitializeCameraAsync()
{
    _mediaCapture = new MediaCapture();

    var settings = new MediaCaptureInitializationSettings
    {
        StreamingCaptureMode = StreamingCaptureMode.Video
    };

    // Optionally select a specific camera
    var devices = await DeviceInformation.FindAllAsync(
        DeviceClass.VideoCapture);

    if (devices.Count > 0)
    {
        settings.VideoDeviceId = devices[0].Id;
    }

    try
    {
        await _mediaCapture.InitializeAsync(settings);
    }
    catch (UnauthorizedAccessException)
    {
        // Camera access denied — prompt the user to enable camera
        // access in Windows Settings.
        return;
    }
}

Iniciar y detener la versión preliminar

Después de inicializar MediaCapture, conecte la cámara a la MediaPlayerElement pantalla de vista previa. En WinUI 3, usa un MediaFrameSource para enviar fotogramas al reproductor:

using Windows.Media.Capture;
using Windows.Media.Capture.Frames;
using Microsoft.UI.Xaml.Controls;

private async Task StartPreviewAsync()
{
    // Get a frame source for the preview stream
    var frameSource = _mediaCapture.FrameSources.FirstOrDefault(
        source => source.Value.Info.MediaStreamType ==
            Windows.Media.Capture.MediaStreamType.VideoPreview
            || source.Value.Info.SourceKind ==
            MediaFrameSourceKind.Color);

    if (frameSource.Value != null)
    {
        var mediaSource = Windows.Media.Core.MediaSource
            .CreateFromMediaFrameSource(frameSource.Value);
        PreviewElement.Source = mediaSource;
    }
}

private async Task StopPreviewAsync()
{
    await _mediaCapture.StopPreviewAsync();
    PreviewElement.Source = null;
}

Note

En WinUI 3, no hay ningún CaptureElement control. En su lugar, conecte MediaCapture a un MediaPlayerElement creando un MediaSource a partir de un MediaFrameSource. Esto le proporciona control sobre qué fuente de fotogramas (cámara frontal, cámara trasera, etc.) proporciona la vista previa. Consulta Mostrar la vista previa de la cámara en una aplicación WinUI para obtener el enfoque recomendado mediante el ejemplo de cámara de Windows.

Gestionar el control exclusivo

Cuando otra aplicación toma el control exclusivo de la cámara, la MediaCapture instancia recibe un evento Failed . Regístrese para este evento, por ejemplo, en el método de inicialización:

_mediaCapture.Failed += MediaCapture_Failed;

A continuación, limpie la vista previa cuando ocurra el evento:

private void MediaCapture_Failed(MediaCapture sender,
    MediaCaptureFailedEventArgs errorEventArgs)
{
    DispatcherQueue.TryEnqueue(async () =>
    {
        await StopPreviewAsync();
        // Display an error message to the user
    });
}

Importante

En las aplicaciones de escritorio de WinUI 3, use DispatcherQueue.TryEnqueue para reenviar las llamadas al hilo de la interfaz de usuario. El método UWP CoreDispatcher.RunAsync no está disponible.

Controlar eventos del ciclo de vida de la ventana

En una aplicación de escritorio winUI 3, el recurso de cámara permanece activo incluso cuando la ventana está minimizada o oculta. Debe detener la vista previa cuando la ventana no esté visible y reiniciarla cuando la ventana vuelva a estar visible. En el constructor de su ventana o en el método de inicialización, regístrese en el evento VisibilityChanged:

this.VisibilityChanged += Window_VisibilityChanged;

A continuación, implemente el controlador:

private async void Window_VisibilityChanged(object sender,
    Microsoft.UI.Xaml.WindowVisibilityChangedEventArgs args)
{
    if (args.Visible)
    {
        await StartPreviewAsync();
    }
    else
    {
        await StopPreviewAsync();
    }
}

Limpieza de recursos

Cuando se cierre la ventana, detenga la vista previa y elimine la MediaCapture instancia. Suscríbete al evento Closed, por ejemplo, en el constructor de la ventana:

this.Closed += Window_Closed;

A continuación, implemente el controlador:

private async void Window_Closed(object sender,
    Microsoft.UI.Xaml.WindowEventArgs args)
{
    await StopPreviewAsync();
    _mediaCapture?.Dispose();
    _mediaCapture = null;
}