Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule pokazano, jak wyświetlić strumień podglądu aparatu w aplikacji klasycznej WinUI 3, obsługiwać scenariusze wyłącznej kontroli i zarządzać zdarzeniami cyklu życia aplikacji. Aby szybko zapoznać się z podstawami wyświetlania podglądu z kamery, zobacz artykuł Wyświetlanie podglądu z kamery w aplikacji WinUI.
Wyświetlanie podglądu aparatu
W systemie WinUI 3 używasz elementu MediaPlayerElement do wyświetlania podglądu aparatu. Kontrolka UWP CaptureElement nie jest dostępna w WinUI 3.
Dodaj element MediaPlayerElement do strony XAML:
<MediaPlayerElement x:Name="PreviewElement"
AutoPlay="True"
HorizontalAlignment="Stretch" />
Zainicjuj obiekt MediaCapture
Utwórz instancję MediaCapture i zainicjuj ją przy użyciu żądanych ustawień. Określone urządzenie aparatu można określić, ustawiając parametr 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;
}
}
Uruchamianie i zatrzymywanie podglądu
Po zainicjowaniu MediaCapture podłącz aparat do MediaPlayerElement, aby wyświetlić podgląd. W systemie WinUI 3 użyj elementu MediaFrameSource , aby wsunąć ramki do odtwarzacza:
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
W WinUI 3 nie ma kontrolki CaptureElement. Zamiast tego nawiąż połączenie z MediaCapture elementem MediaPlayerElement , tworząc element MediaSource na podstawie elementu MediaFrameSource. Zapewnia to kontrolę nad tym, które źródło ramki (przedni aparat, tylny aparat itp.) zapewnia podgląd. Zobacz Wyświetlanie podglądu aparatu w aplikacji WinUI, aby zapoznać się z zalecanym podejściem przy użyciu przykładu Windows Camera.
Obsługa wyłącznej kontrolki
Gdy inna aplikacja uzyskuje wyłączną kontrolę nad aparatem, instancja MediaCapture otrzymuje zdarzenie Failed. Zarejestruj się na potrzeby tego zdarzenia, na przykład w metodzie inicjowania:
_mediaCapture.Failed += MediaCapture_Failed;
Następnie wyczyść podgląd po wystąpieniu zdarzenia:
private void MediaCapture_Failed(MediaCapture sender,
MediaCaptureFailedEventArgs errorEventArgs)
{
DispatcherQueue.TryEnqueue(async () =>
{
await StopPreviewAsync();
// Display an error message to the user
});
}
Ważna
W aplikacjach klasycznych WinUI 3 użyj DispatcherQueue.TryEnqueue, aby przekazywać wywołania z powrotem do wątku UI. Metoda UWP CoreDispatcher.RunAsync jest niedostępna.
Obsługa zdarzeń cyklu życia okna
W aplikacji klasycznej WinUI 3 zasób aparatu pozostaje aktywny nawet wtedy, gdy okno jest zminimalizowane lub ukryte. Należy zatrzymać podgląd, gdy okno nie jest widoczne i ponownie uruchomić je po ponownym wyświetleniu okna. W konstruktorze okna lub metodzie inicjalizacji zarejestruj procedurę obsługi zdarzenia VisibilityChanged:
this.VisibilityChanged += Window_VisibilityChanged;
Następnie zaimplementuj program obsługi:
private async void Window_VisibilityChanged(object sender,
Microsoft.UI.Xaml.WindowVisibilityChangedEventArgs args)
{
if (args.Visible)
{
await StartPreviewAsync();
}
else
{
await StopPreviewAsync();
}
}
Uprzątnij zasoby
Po zamknięciu okna zatrzymaj podgląd i zlikwiduj MediaCapture wystąpienie. Zarejestruj obsługę zdarzenia Closed, na przykład w konstruktorze okna:
this.Closed += Window_Closed;
Następnie zaimplementuj program obsługi:
private async void Window_Closed(object sender,
Microsoft.UI.Xaml.WindowEventArgs args)
{
await StopPreviewAsync();
_mediaCapture?.Dispose();
_mediaCapture = null;
}