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 przedstawiono najprostszy sposób przechwytywania zdjęć i wideo przy użyciu klasy MediaCapture . Klasa MediaCapture udostępnia niezawodny zestaw interfejsów API, które zapewniają kontrolę niskiego poziomu nad potokiem rejestrowania i umożliwiają zaawansowane scenariusze przechwytywania, ale ten artykuł ma pomóc w szybkim i łatwym dodaniu podstawowego rejestrowania multimediów do aplikacji. Aby dowiedzieć się więcej o funkcjach oferowanych przez program MediaCapture , zobacz Aparat.
Inicjowanie obiektu MediaCapture
Wszystkie metody przechwytywania opisane w tym artykule wymagają pierwszego kroku inicjowania obiektu MediaCapture . Obejmuje to utworzenie wystąpienia obiektu, wybranie urządzenia przechwytywania, ustawienie parametrów inicjowania, a następnie wywołanie metody InitializeAsync. Zazwyczaj aplikacje aparatu wyświetlają podgląd aparatu podczas przechwytywania zdjęć lub wideo w interfejsie użytkownika przy użyciu elementu MediaPlayerElement. Aby zapoznać się z przewodnikiem inicjowania aplikacji MediaCapture i wyświetlania podglądu w interfejsie użytkownika XAML, zobacz Show the camera preview in a WinUI app (Wyświetlanie podglądu aparatu w aplikacji WinUI). W przykładach kodu w tym artykule przyjęto założenie, że zainicjowane wystąpienie MediaCapture zostało już utworzone.
Przechwyć zdjęcie do SoftwareBitmap
Klasa SoftwareBitmap udostępnia wspólną reprezentację obrazów w wielu funkcjach. Jeśli chcesz przechwycić zdjęcie, a następnie natychmiast użyć przechwyconego obrazu w aplikacji, na przykład wyświetlając go w XAML, zamiast przechwytywania do pliku, należy przechwycić go jako SoftwareBitmap. Nadal masz możliwość zapisania obrazu na dysku później.
Przechwyć zdjęcie na mapie SoftwareBitmap przy użyciu klasy LowLagPhotoCapture . Pobierz wystąpienie tej klasy, wywołując metodę PrepareLowLagPhotoCaptureAsync, przekazując obiekt ImageEncodingProperties określający żądany format obrazu. Metoda CreateUncompressed tworzy nieskompresowane kodowanie z określonym formatem pikseli. Zainicjuj przechwytywanie zdjęć, wywołując metodę CaptureAsync, która zwraca obiekt CapturePhoto . Pobierz mapę SoftwareBitmap , korzystając z właściwości Frame , a następnie właściwości SoftwareBitmap .
Wiele zdjęć można przechwycić, wielokrotnie wywołując funkcję CaptureAsync. Po zakończeniu przechwytywania wywołaj metodę FinishAsync , aby zamknąć sesję LowLagPhotoCapture i zwolnić skojarzone zasoby. Po wywołaniu metody FinishAsync, aby ponownie rozpocząć przechwytywanie zdjęć, należy ponownie wywołać metodę PrepareLowLagPhotoCaptureAsync , aby ponownie zainicjować sesję przechwytywania przed wywołaniem metody CaptureAsync.
// Prepare and capture photo
var lowLagCapture = await m_mediaCapture.PrepareLowLagPhotoCaptureAsync(ImageEncodingProperties.CreateUncompressed(MediaPixelFormat.Bgra8));
var capturedPhoto = await lowLagCapture.CaptureAsync();
var softwareBitmap = capturedPhoto.Frame.SoftwareBitmap;
// Capture more photos, if desired.
// Then call FinishAsync to clean up resources
await lowLagCapture.FinishAsync();
Przechwytywanie zdjęcia do strumienia pamięci
Za pomocą programu MediaCapture można przechwycić zdjęcie do strumienia w pamięci, którego następnie można użyć do transkodowania zdjęcia ze strumienia do pliku na dysku.
Utwórz element InMemoryRandomAccessStream , a następnie wywołaj metodę CapturePhotoToStreamAsync , aby przechwycić zdjęcie do strumienia, przekazując strumień i obiekt ImageEncodingProperties określający format obrazu, który ma być używany. Właściwości kodowania niestandardowego można utworzyć samodzielnie, inicjując obiekt, ale klasa udostępnia metody statyczne, takie jak ImageEncodingProperties.CreateJpeg dla typowych formatów kodowania.
Utwórz BitmapDecoder, aby zdekodować obraz ze strumienia w pamięci. Utwórz BitmapEncoder, aby zakodować obraz do pliku, wywołując metodę CreateForTranscodingAsync.
Opcjonalnie możesz utworzyć obiekt BitmapPropertySet , a następnie wywołać metodę SetPropertiesAsync w koderze obrazu, aby uwzględnić metadane dotyczące zdjęcia w pliku obrazu. Aby uzyskać więcej informacji na temat właściwości kodowania, zobacz Metadane obrazu.
Na koniec wywołaj metodę FlushAsync w obiekcie kodera, aby transkodować zdjęcie ze strumienia w pamięci do pliku.
// Prepare and capture photo
var lowLagCapture = await m_mediaCapture.PrepareLowLagPhotoCaptureAsync(ImageEncodingProperties.CreateUncompressed(MediaPixelFormat.Bgra8));
var capturedPhoto = await lowLagCapture.CaptureAsync();
var softwareBitmap = capturedPhoto.Frame.SoftwareBitmap;
// Capture more photos, if desired.
// Then call FinishAsync to clean up resources
await lowLagCapture.FinishAsync();
Przechwytywanie wideo
Szybko dodaj przechwytywanie wideo do aplikacji przy użyciu klasy LowLagMediaRecording .
Najpierw obiekt LowLagMediaRecording musi być trwały podczas przechwytywania wideo, więc zadeklaruj zmienną klasy dla tego obiektu.
LowLagMediaRecording m_mediaRecording;
Wywołaj metodę PrepareLowLagRecordToStorageFileAsync, aby zainicjować nagrywanie multimediów, przekazując plik przechowywania i obiekt MediaEncodingProfile, który określa kodowanie dla wideo. Klasa udostępnia metody statyczne, takie jak CreateMp4, do tworzenia typowych profilów kodowania wideo. Wywołaj metodę StartAsync , aby rozpocząć przechwytywanie wideo.
var myVideos = await Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Videos);
StorageFile file = await myVideos.SaveFolder.CreateFileAsync("video.mp4", CreationCollisionOption.GenerateUniqueName);
m_mediaRecording = await m_mediaCapture.PrepareLowLagRecordToStorageFileAsync(
MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Auto), file);
m_mediaCapture.RecordLimitationExceeded += m_mediaCapture_RecordLimitationExceeded;
await m_mediaRecording.StartAsync();
Aby zatrzymać nagrywanie wideo, wywołaj metodę StopAsync.
await m_mediaRecording.StopAsync();
Aby przechwytywać dodatkowe wideo, możesz nadal wywoływać metody StartAsync i StopAsync. Po zakończeniu przechwytywania wideo wywołaj metodę FinishAsync , aby usunąć sesję przechwytywania i wyczyścić skojarzone zasoby. Po wywołaniu tego wywołania należy ponownie wywołać metodę PrepareLowLagRecordToStorageFileAsync , aby ponownie zainicjować sesję przechwytywania przed wywołaniem metody StartAsync.
await m_mediaRecording.FinishAsync();
Podczas przechwytywania wideo należy zarejestrować obsługę zdarzenia RecordLimitationExceeded dla obiektu MediaCapture, które zostanie wywołane przez system operacyjny, jeśli przekroczysz limit dla pojedynczego nagrania, obecnie trzy godziny. W procedurze obsługi zdarzenia należy sfinalizować nagrywanie, wywołując metodę StopAsync.
private async void m_mediaCapture_RecordLimitationExceeded(MediaCapture sender)
{
await m_mediaRecording.StopAsync();
DispatcherQueue.TryEnqueue(() =>
{
tbStatus.Text = "Record limitation exceeded.";
});
}
Możesz wstrzymać nagrywanie wideo, a następnie wznowić nagrywanie bez tworzenia oddzielnego pliku wyjściowego, wywołując funkcję PauseAsync , a następnie wywołując funkcję ResumeAsync.
await m_mediaRecording.PauseAsync(Windows.Media.Devices.MediaCapturePauseBehavior.ReleaseHardwareResources);
await m_mediaRecording.ResumeAsync();
Wywołanie funkcji PauseWithResultAsync zwraca obiekt MediaCapturePauseResult . Właściwość LastFrame jest obiektem VideoFrame reprezentującym ostatnią ramkę. Aby wyświetlić klatkę w XAML, pobierz reprezentację SoftwareBitmap ramki wideo. Obecnie obsługiwane są tylko obrazy w formacie BGRA8 z przemnożonym lub pustym kanałem alfa, więc wywołaj Konwertuj, jeśli jest to konieczne, aby uzyskać poprawny format. Funkcja PauseWithResultAsync zwraca również czas trwania wideo, który został zarejestrowany w poprzednim segmencie w przypadku konieczności śledzenia całkowitego czasu zarejestrowania.
Możesz również uzyskać ramkę wyników po zatrzymaniu wideo, wywołując polecenie StopWithResultAsync.
Odtwarzanie i edytowanie przechwyconych plików wideo
Po przechwyceniu wideo do pliku możesz załadować plik i odtworzyć go z powrotem w interfejsie użytkownika aplikacji. Można to zrobić przy użyciu kontrolki XAML MediaPlayerElement i skojarzonego odtwarzacza MediaPlayer. Aby uzyskać informacje na temat odtwarzania multimediów na stronie XAML, zobacz Odtwarzanie dźwięku i wideo za pomocą odtwarzacza MediaPlayer.
Możesz również utworzyć obiekt MediaClip z pliku wideo, wywołując wywołanie metody CreateFromFileAsync. Aplikacja MediaComposition zapewnia podstawowe funkcje edycji wideo, takie jak rozmieszczanie sekwencji obiektów MediaClip, przycinanie długości wideo, tworzenie warstw, dodawanie muzyki w tle i stosowanie efektów wideo. Aby uzyskać więcej informacji na temat pracy z kompozycjami medialnymi, zobacz Kompozycje i edytowanie multimediów.
Przechwytywanie dźwięku
Możesz szybko dodać przechwytywanie dźwięku do aplikacji przy użyciu tej samej techniki przedstawionej powyżej w celu przechwytywania wideo. Wywołaj PrepareLowLagRecordToStorageFileAsync, aby zainicjować sesję przechwytywania, przekazując plik i MediaEncodingProfile, który jest generowany w tym przykładzie za pomocą metody statycznej CreateMp3. Aby rozpocząć nagrywanie, wywołaj metodę StartAsync.
m_mediaCapture.RecordLimitationExceeded += m_mediaCapture_RecordLimitationExceeded;
var myVideos = await Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Videos);
StorageFile file = await myVideos.SaveFolder.CreateFileAsync("audio.mp3", CreationCollisionOption.GenerateUniqueName);
m_mediaRecording = await m_mediaCapture.PrepareLowLagRecordToStorageFileAsync(
MediaEncodingProfile.CreateMp3(AudioEncodingQuality.High), file);
await m_mediaRecording.StartAsync();
Wywołaj metodę StopAsync , aby zatrzymać nagrywanie dźwięku.
await m_mediaRecording.StopAsync();
Możesz wywołać funkcję StartAsync i StopAsync wiele razy, aby zarejestrować kilka plików audio. Po zakończeniu przechwytywania dźwięku wywołaj metodę FinishAsync , aby usunąć sesję przechwytywania i wyczyścić skojarzone zasoby. Po wywołaniu tego wywołania należy ponownie wywołać metodę PrepareLowLagRecordToStorageFileAsync , aby ponownie zainicjować sesję przechwytywania przed wywołaniem metody StartAsync.
Aby uzyskać informacje na temat wykrywania zmian w systemie poziomu dźwięku strumienia przechwytywania dźwięku, zobacz Wykrywanie zmian na poziomie dźwięku i reagowanie na nie przez system.