Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek ukazuje nejjednodušší způsob, jak zachytit fotky a video pomocí třídy MediaCapture . Třída MediaCapture zveřejňuje robustní sadu rozhraní API, která poskytují kontrolu nad kanálem zachycení na nízké úrovni a umožňují pokročilé scénáře zachycení, ale tento článek je určený k rychlému a snadnému přidání základního zachytávání médií do aplikace. Další informace o funkcích, které MediaCapture poskytuje, najdete v tématu Kamera.
Inicializujte objekt MediaCapture
Všechny metody zachycení popsané v tomto článku vyžadují první krok inicializace MediaCapture objektu. To zahrnuje vytvoření instance objektu, výběr zařízení pro zachycení, nastavení inicializačních parametrů a následné volání InitializeAsync. Aplikace fotoaparátu obvykle zobrazí náhled fotoaparátu při pořizování fotek nebo videa v uživatelském rozhraní pomocí MediaPlayerElement. Návod k inicializaci MediaCapture a zobrazení náhledu v uživatelském rozhraní XAML najdete v tématu Zobrazení náhledu fotoaparátu v aplikaci WinUI. Příklady kódu v tomto článku předpokládají, že inicializovaná instance MediaCapture již byla vytvořena.
Zachycení fotky do mapy SoftwareBitmap
Třída SoftwareBitmap poskytuje společnou reprezentaci obrázků napříč více funkcemi. Pokud chcete zachytit fotku a pak okamžitě použít zachycený obrázek ve vaší aplikaci, jako je například jeho zobrazení v XAML, místo zachytávání do souboru, pak byste měli zachytit softwareBitmap. Stále máte možnost uložit image na disk později.
Zachyťte fotografii do SoftwareBitmap pomocí třídy LowLagPhotoCapture . Získejte instanci této třídy voláním PrepareLowLagPhotoCaptureAsync a předáním ImageEncodingProperties objektu určující požadovaný formát obrázku. CreateUncompressed vytvoří nekomprimované kódování se zadaným formátem pixelů. Zahajte pořizování fotek voláním CaptureAsync, který vrací objekt CapturedPhoto . Získejte SoftwareBitmap přístupem k Frame vlastnost a poté SoftwareBitmap vlastnost.
Více fotek můžete zachytit opakovaným voláním captureAsync. Po dokončení zachycení zavolejte FinishAsync k ukončení relace LowLagPhotoCapture a uvolnění přidružených prostředků. Po volání FinishAsync budete muset znovu zavolat PrepareLowLagPhotoCaptureAsync , aby se znovu inicializovala relace zachycení před voláním 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();
Zachycení fotky do datového proudu paměti
Pomocí MediaCapture můžete zachytit fotku do datového proudu v paměti, který pak můžete použít k překódování fotografie ze streamu do souboru na disku.
Vytvořte InMemoryRandomAccessStream a potom zavolejte CapturePhotoToStreamAsync, abyste zachytili fotku do streamu, přičemž předáte stream a objekt ImageEncodingProperties určující formát obrázku, který se má použít. Můžete vytvořit vlastní vlastnosti kódování inicializací objektu sami, ale třída poskytuje statické metody, jako ImageEncodingProperties.CreateJpeg, pro běžné formáty kódování.
Vytvořte BitmapDecoder pro dekódování obrázku z datového proudu paměti. Vytvořte BitmapEncoder pro kódování obrázku do souboru voláním CreateForTranscodingAsync.
Volitelně můžete vytvořit BitmapPropertySet objekt a pak volat SetPropertiesAsync v kodéru obrázku, aby zahrnoval metadata o fotce v souboru obrázku. Další informace o vlastnostech kódování naleznete v tématu Metadata obrázku.
Nakonec zavolejte FlushAsync u objektu kodéru, který překóduje fotku z datového proudu v paměti do souboru.
// 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();
Zachycení videa
Pomocí třídy LowLagMediaRecording můžete do své aplikace rychle přidat záznam videa.
Nejprve musí být LowLagMediaRecording zachováno během zachycení videa, takže deklarujte proměnnou člen třídy pro tento objekt.
LowLagMediaRecording m_mediaRecording;
Zavolejte PrepareLowLagRecordToStorageFileAsync pro inicializaci záznamu médií. Předáte úložný soubor a objekt MediaEncodingProfile, který určuje kódování videa. Třída poskytuje statické metody, jako CreateMp4, k vytváření běžných profilů kódování videa. Zavolejte StartAsync pro spuštění záznamu videa.
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();
Pokud chcete zastavit nahrávání videa, zavolejte StopAsync.
await m_mediaRecording.StopAsync();
Můžete volat StartAsync a StopAsync pro zachycení dalších videí. Až dokončíte zachycení videí, zavolejte FinishAsync, aby se zavřela relace zachycení a vyčistily přidružené prostředky. Po tomto volání je nutné znovu zavolat PrepareLowLagRecordToStorageFileAsync, kterou znovu inicializujete relaci zachycení, před zavoláním StartAsync.
await m_mediaRecording.FinishAsync();
Při záznamu videa byste měli zaregistrovat obslužnou rutinu pro RecordLimitationExceeded události MediaCapture objektu, která bude vyvolána operačním systémem, pokud překročíte limit pro jeden záznam, aktuálně tři hodiny. V obsluze události byste měli dokončit nahrávání voláním StopAsync.
private async void m_mediaCapture_RecordLimitationExceeded(MediaCapture sender)
{
await m_mediaRecording.StopAsync();
DispatcherQueue.TryEnqueue(() =>
{
tbStatus.Text = "Record limitation exceeded.";
});
}
Nahrávání videa můžete pozastavit a pak pokračovat v nahrávání bez vytvoření samostatného výstupního souboru voláním PauseAsync a následným voláním ResumeAsync.
await m_mediaRecording.PauseAsync(Windows.Media.Devices.MediaCapturePauseBehavior.ReleaseHardwareResources);
await m_mediaRecording.ResumeAsync();
Volání PauseWithResultAsync vrátí MediaCapturePauseResult objekt. Vlastnost LastFrame je objekt VideoFrame představující poslední snímek. Pokud chcete zobrazit rámeček v XAML, získejte reprezentaci softwarové mapy rámečku videa. Momentálně jsou podporovány pouze obrázky ve formátu BGRA8 s předem násobeným nebo prázdným alfa kanálem, takže v případě potřeby zavolejte Převést, abyste získali správný formát. PauseWithResultAsync také vrátí dobu trvání videa zaznamenaného v předchozím segmentu v případě, že potřebujete sledovat, kolik celkového času bylo zaznamenáno.
Rámeček výsledku můžete získat také při zastavení videa voláním StopWithResultAsync.
Přehrávání a úprava zachycených videosouborů
Po zachycení videa do souboru ho možná budete chtít načíst a přehrát zpátky v uživatelském rozhraní vaší aplikace. Můžete to provést pomocí MediaPlayerElement XAML ovládacího prvku a přidruženého MediaPlayeru. Informace o přehrávání médií na stránce XAML naleznete v tématu Přehrávání zvuku a videa pomocí MediaPlayeru.
Objekt MediaClip můžete také vytvořit z videosouboru voláním CreateFromFileAsync. MediaComposition poskytuje základní funkce pro úpravy videa, jako je uspořádání posloupnosti objektů MediaClip, oříznutí délky videa, vytváření vrstev, přidání hudby na pozadí a použití video efektů. Další informace o práci s multimediálními skladbami naleznete v tématu Multimediální skladby a úpravy.
Zachycení zvuku
K rychlému přidání zvukového záznamu do aplikace můžete použít stejnou techniku, jak je znázorněno výše pro zachytávání videa. Volání PrepareLowLagRecordToStorageFileAsync k inicializaci relace zachycení, předání souboru a MediaEncodingProfile , který je generován v tomto příkladu metodou CreateMp3 static. Pokud chcete začít nahrávat, zavolejte 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();
Zastavte záznam zvuku voláním StopAsync .
await m_mediaRecording.StopAsync();
Můžete volat StartAsync a StopAsync vícekrát a nahrát několik zvukových souborů. Po dokončení záznamu zvuku zavolejte FinishAsync, aby se ukončila záznamová relace a vyčistily přidružené prostředky. Po tomto volání je nutné znovu zavolat PrepareLowLagRecordToStorageFileAsync, kterou znovu inicializujete relaci zachycení, před zavoláním StartAsync.
Informace o zjišťování, kdy systém změní úroveň zvuku streamu zvukového záznamu, naleznete v tématu Rozpoznání a reakce na změny na úrovni zvuku systémem.
Windows developer