Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo illustra il modo più semplice per acquisire foto e video usando la classe MediaCapture . La classe MediaCapture espone un set affidabile di API che forniscono un controllo di basso livello sulla pipeline di acquisizione e abilitano scenari di acquisizione avanzati, ma questo articolo consente di aggiungere l'acquisizione multimediale di base all'app in modo rapido e semplice. Per altre informazioni sulle funzionalità offerte da MediaCapture , vedi Fotocamera.
Inizializzare l'oggetto MediaCapture
Tutti i metodi di acquisizione descritti in questo articolo richiedono il primo passaggio dell'inizializzazione dell'oggetto MediaCapture . Ciò include la creazione di un'istanza dell'oggetto, la selezione di un dispositivo di acquisizione, l'impostazione dei parametri di inizializzazione e la chiamata di InitializeAsync. In genere, le app fotocamera visualizzeranno l'anteprima della fotocamera durante l'acquisizione di foto o video nell'interfaccia utente usando MediaPlayerElement. Per una procedura dettagliata sull'inizializzazione di MediaCapture e sulla visualizzazione dell'anteprima in un'interfaccia utente XAML, vedi Visualizzare l'anteprima della fotocamera in un'app WinUI. Gli esempi di codice in questo articolo presuppongono che sia già stata creata un'istanza inizializzata di MediaCapture .
Acquisire una foto su un SoftwareBitmap
La classe SoftwareBitmap fornisce una rappresentazione comune delle immagini tra più funzionalità. Se vuoi acquisire una foto e quindi usare immediatamente l'immagine acquisita nella tua app, ad esempio nella visualizzazione in XAML, anziché acquisirla in un file, devi acquisirla in un SoftwareBitmap. È comunque possibile salvare l'immagine su disco in un secondo momento.
Scattare un'immagine in un SoftwareBitmap usando la classe LowLagPhotoCapture. Ottenere un'istanza di questa classe chiamando PrepareLowLagPhotoCaptureAsync, passando un oggetto ImageEncodingProperties che specifica il formato di immagine desiderato. CreateUncompressed crea una codifica non compressa con il formato pixel specificato. Avviare l'acquisizione di foto chiamando CaptureAsync, che restituisce un oggetto CapturedPhoto . Ottenere un softwareBitmap accedendo alla proprietà Frame e quindi alla proprietà SoftwareBitmap .
Puoi acquisire più foto chiamando ripetutamente CaptureAsync. Al termine dell'acquisizione, chiama FinishAsync per arrestare la sessione LowLagPhotoCapture e liberare le risorse associate. Dopo aver chiamato FinishAsync, per iniziare a acquisire nuovamente le foto, dovrai chiamare di nuovo PrepareLowLagPhotoCaptureAsync per reinizializzare la sessione di acquisizione prima di chiamare 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();
Catturare una foto in un flusso di memoria
Puoi usare MediaCapture per acquisire una foto in un flusso in memoria, che puoi quindi usare per transcodificare la foto dal flusso a un file su disco.
Creare un InMemoryRandomAccessStream e quindi chiamare CapturePhotoToStreamAsync per acquisire una foto nel flusso, passando il flusso e un oggetto ImageEncodingProperties che specifica il formato dell'immagine da utilizzare. È possibile creare proprietà di codifica personalizzate inizializzando l'oggetto manualmente, ma la classe fornisce metodi statici, ad esempio ImageEncodingProperties.CreateJpeg per formati di codifica comuni.
Creare un BitmapDecoder per decodificare dal flusso in memoria l'immagine. Creare un bitmapEncoder per codificare l'immagine in un file chiamando CreateForTranscodingAsync.
Facoltativamente, è possibile creare un oggetto BitmapPropertySet e quindi chiamare SetPropertiesAsync nel codificatore di immagini per includere i metadati relativi alla foto nel file di immagine. Per altre informazioni sulle proprietà di codifica, vedere Metadati dell'immagine.
Infine, chiama FlushAsync sull'oggetto codificatore per transcodificare la foto dal flusso in memoria al file.
// 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();
Registrare un video
Aggiungere rapidamente l'acquisizione video all'app usando la classe LowLagMediaRecording .
In primo luogo, LowLagMediaRecording deve essere persistente durante l'acquisizione del video, quindi dichiarare una variabile di classe per l'oggetto.
LowLagMediaRecording m_mediaRecording;
Chiamare PrepareLowLagRecordToStorageFileAsync per inizializzare la registrazione multimediale, passando il file di archiviazione e un oggetto MediaEncodingProfile che specifica la codifica per il video. La classe fornisce metodi statici, ad esempio CreateMp4, per la creazione di profili di codifica video comuni. Chiama StartAsync per iniziare l'acquisizione di video.
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();
Per interrompere la registrazione del video, chiama StopAsync.
await m_mediaRecording.StopAsync();
È possibile continuare a chiamare StartAsync e StopAsync per acquisire video aggiuntivi. Al termine dell'acquisizione di video, chiama FinishAsync per eliminare la sessione di acquisizione e pulire le risorse associate. Dopo questa chiamata, è necessario chiamare di nuovo PrepareLowLagRecordToStorageFileAsync per reinizializzare la sessione di acquisizione prima di chiamare StartAsync.
await m_mediaRecording.FinishAsync();
Durante l'acquisizione di video, devi registrare un gestore per l'evento RecordLimitationExceeded dell'oggetto MediaCapture , che verrà generato dal sistema operativo se superi il limite per una singola registrazione, attualmente tre ore. Nel gestore per l'evento è necessario finalizzare la registrazione chiamando StopAsync.
private async void m_mediaCapture_RecordLimitationExceeded(MediaCapture sender)
{
await m_mediaRecording.StopAsync();
DispatcherQueue.TryEnqueue(() =>
{
tbStatus.Text = "Record limitation exceeded.";
});
}
È possibile sospendere una registrazione video e quindi riprendere la registrazione senza creare un file di output separato chiamando PauseAsync e quindi chiamando ResumeAsync.
await m_mediaRecording.PauseAsync(Windows.Media.Devices.MediaCapturePauseBehavior.ReleaseHardwareResources);
await m_mediaRecording.ResumeAsync();
La chiamata a PauseWithResultAsync restituisce un oggetto MediaCapturePauseResult . La proprietà LastFrame è un oggetto VideoFrame che rappresenta l'ultimo fotogramma. Per visualizzare il fotogramma in XAML, ottenere la rappresentazione SoftwareBitmap del fotogramma video. Attualmente sono supportate solo immagini in formato BGRA8 con canale alfa premoltiplicato o vuoto, quindi chiamare Converti se necessario per ottenere il formato corretto. PauseWithResultAsync restituisce anche la durata del video registrato nel segmento precedente nel caso in cui sia necessario tenere traccia del tempo totale registrato.
È anche possibile ottenere un frame di risultato quando si arresta il video chiamando StopWithResultAsync.
Riprodurre e modificare i file video acquisiti
Dopo aver acquisito un video in un file, è possibile caricare il file e riprodurlo nell'interfaccia utente dell'app. Puoi farlo usando il controllo XAML MediaPlayerElement e un MediaPlayer associato. Per informazioni sulla riproduzione di contenuti multimediali in una pagina XAML, vedi Riprodurre audio e video con MediaPlayer.
[TBD : il framework MediaComposition è supportato/consigliato per WinUI?]
È anche possibile creare un oggetto MediaClip da un file video chiamando CreateFromFileAsync. MediaComposition offre funzionalità di modifica video di base, ad esempio la disposizione della sequenza di oggetti MediaClip, il taglio della lunghezza del video, la creazione di livelli, l'aggiunta di musica di sottofondo e l'applicazione di effetti video. Per altre informazioni sull'uso delle composizioni multimediali, vedi Composizioni multimediali e modifica.
Acquisire audio
È possibile aggiungere rapidamente l'acquisizione audio all'app usando la stessa tecnica illustrata in precedenza per l'acquisizione di video. Chiamare PrepareLowLagRecordToStorageFileAsync per inizializzare la sessione di acquisizione, passando il file e un MediaEncodingProfile generato in questo esempio dal metodo statico CreateMp3. Per iniziare la registrazione, chiama StartAsync.
[TBD : questo codice genera 'La richiesta non è valida nello stato corrente']
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();
Chiama StopAsync per arrestare la registrazione audio.
await m_mediaRecording.StopAsync();
Puoi chiamare StartAsync e StopAsync più volte per registrare più file audio. Al termine dell'acquisizione dell'audio, chiamare FinishAsync per eliminare la sessione di acquisizione e pulire le risorse associate. Dopo questa chiamata, è necessario chiamare di nuovo PrepareLowLagRecordToStorageFileAsync per reinizializzare la sessione di acquisizione prima di chiamare StartAsync.
Per informazioni sul rilevamento quando il sistema modifica il livello audio del flusso di acquisizione audio, vedi Rilevare e rispondere alle modifiche del livello audio dal sistema.