Acquisizione di foto, video e audio di base con MediaCaptureBasic photo, video, and audio capture with MediaCapture

Questo articolo illustra il modo più semplice per acquisire foto e video con la classe MediaCapture .This article shows the simplest way to capture photos and video using the MediaCapture class. La classe MediaCapture espone un solido set di API che offrono un controllo di basso livello sulla pipeline di acquisizione e abilitano scenari di acquisizione avanzati, ma questo articolo è pensato per aiutarti ad aggiungere funzionalità di acquisizione multimediale di base alla tua app in modo semplice e rapido.The MediaCapture class exposes a robust set of APIs that provide low-level control over the capture pipeline and enable advanced capture scenarios, but this article is intended to help you add basic media capture to your app quickly and easily. Per ulteriori informazioni sulle funzionalità offerte da MediaCapture , vedere la pagina relativa alla fotocamera.To learn about more of the features that MediaCapture provides, see Camera.

Se si vuole semplicemente acquisire una foto o un video e non si intende aggiungere altre funzionalità di acquisizione di supporti, oppure se non si vuole creare una propria interfaccia utente della fotocamera, è possibile usare la classe CameraCaptureUI , che consente di avviare semplicemente l'app della fotocamera incorporata di Windows e ricevere il file di foto o video acquisito.If you simply want to capture a photo or video and don't intend to add any additional media capture features, or if you don't want to create your own camera UI, you may want to use the CameraCaptureUI class, which allows you to simply launch the Windows built-in camera app and receive the photo or video file that was captured. Per altre informazioni, vedere acquisire foto e video con interfaccia utente della fotocamera integrata di WindowsFor more information, see Capture photos and video with Windows built-in camera UI

Il codice in questo articolo è stato adattato dall'esempio della fotocamera Starter Kit .The code in this article was adapted from the Camera starter kit sample. Puoi scaricare l'esempio per visualizzare il codice nel contesto oppure per usarlo come punto di partenza per la tua app.You can download the sample to see the code used in context or to use the sample as a starting point for your own app.

Aggiungere dichiarazioni di funzionalità al manifesto dell'appAdd capability declarations to the app manifest

Affinché l’app possa accedere alla fotocamera di un dispositivo, devi dichiarare l’uso da parte dell’app delle funzionalità webcam e microfono del dispositivo.In order for your app to access a device's camera, you must declare that your app uses the webcam and microphone device capabilities. Per salvare foto e video acquisiti nella raccolta di immagini o video dell'utente, devi dichiarare anche le funzionalità picturesLibrary e videosLibrary.If you want to save captured photos and videos to the users's Pictures or Videos library, you must also declare the picturesLibrary and videosLibrary capability.

Per aggiungere funzionalità al manifesto dell'appTo add capabilities to the app manifest

  1. In Microsoft Visual Studio fai doppio clic sull'elemento package.appxmanifest in Esplora soluzioni per aprire la finestra di progettazione del manifesto dell'applicazione.In Microsoft Visual Studio, in Solution Explorer, open the designer for the application manifest by double-clicking the package.appxmanifest item.
  2. Fare clic sulla scheda Funzionalità.Select the Capabilities tab.
  3. Seleziona la casella di controllo per Webcam e per Microfono.Check the box for Webcam and the box for Microphone.
  4. Per accedere alle raccolte di immagini e video, seleziona le caselle per Raccolta immagini e Catalogo video.For access to the Pictures and Videos library check the boxes for Pictures Library and the box for Videos Library.

Inizializzare l'oggetto MediaCaptureInitialize the MediaCapture object

Tutti i metodi di acquisizione descritti in questo articolo richiedono come primo passaggio l'inizializzazione dell'oggetto MediaCapture chiamando il costruttore e quindi chiamando InitializeAsync.All of the capture methods described in this article require the first step of initializing the MediaCapture object by calling the constructor and then calling InitializeAsync. Poiché all'oggetto MediaCapture si accederà da molte posizioni nell'app, dichiara una variabile di classe per contenere l'oggetto.Since the MediaCapture object will be accessed from multiple places in your app, declare a class variable to hold the object. Implementa un gestore per l'evento Failed di MediaCapture per ricevere una notifica se un'operazione di acquisizione non riesce.Implement a handler for the MediaCapture object's Failed event to be notified if a capture operation fails.

MediaCapture mediaCapture;
bool isPreviewing;
mediaCapture = new MediaCapture();
await mediaCapture.InitializeAsync();
mediaCapture.Failed += MediaCapture_Failed;

Configurare l'anteprima della fotocameraSet up the camera preview

È possibile acquisire foto, video e audio con MediaCapture senza visualizzare l'anteprima della fotocamera, ma in genere vorrai mostrare il flusso di anteprima in modo che l'utente possa vedere ciò che viene acquisito.It's possible to capture photos, videos, and audio using MediaCapture without showing the camera preview, but typically you want to show the preview stream so that the user can see what's being captured. Inoltre, per l'abilitazione di alcune funzionalità di MediaCapture, tra cui messa a fuoco, esposizione e bilanciamento del bianco automatici, è necessario che il flusso di anteprima sia in esecuzione.Also, a few MediaCapture features require the preview stream to be running before they can be enbled, including auto focus, auto exposure, and auto white balance. Per informazioni su come configurare l'anteprima della fotocamera, vedi Visualizzare l'anteprima della fotocamera.To see how to set up the camera preview, see Display the camera preview.

Acquisire una foto in un SoftwareBitmapCapture a photo to a SoftwareBitmap

La classe SoftwareBitmap è stata introdotta in Windows 10 per fornire una rappresentazione comune delle immagini in più funzionalità.The SoftwareBitmap class was introduced in Windows 10 to provide a common representation of images across multiple features. Se vuoi acquisire una foto e quindi usare immediatamente l'immagine acquisita nella tua app, ad esempio visualizzandola in XAML, invece di acquisirla in un file, è preferibile acquisirla in un SoftwareBitmap.If you want to capture a photo and then immediately use the captured image in your app, such as displaying it in XAML, instead of capturing to a file, then you should capture to a SoftwareBitmap. Hai comunque la possibilità di salvare l'immagine su disco in un secondo momento.You still have the option of saving the image to disk later.

Dopo aver inizializzato l'oggetto MediaCapture, puoi acquisire una foto in un SoftwareBitmap usando la classe LowLagPhotoCapture.After initializing the MediaCapture object, you can capture a photo to a SoftwareBitmap using the LowLagPhotoCapture class. Ottieni un'istanza della classe chiamando PrepareLowLagPhotoCaptureAsync, passando un oggetto ImageEncodingProperties che specifica il formato immagine desiderato.Get an instance of this class by calling PrepareLowLagPhotoCaptureAsync, passing in an ImageEncodingProperties object specifying the image format you want. CreateUncompressed crea una codifica non compressi con il formato pixel specificato.CreateUncompressed creates an uncompressed encoding with the specified pixel format. Acquisire una foto chiamando CaptureAsync, che restituisce un oggetto CapturedPhoto .Capture a photo by calling CaptureAsync, which returns a CapturedPhoto object. Ottieni un SoftwareBitmap accedendo alla proprietà Frame e quindi alla proprietà SoftwareBitmap.Get a SoftwareBitmap by accessing the Frame property and then the SoftwareBitmap property.

Se vuoi, puoi acquisire più foto chiamando ripetutamente CaptureAsync.If you want, you can capture multiple photos by repeatedly calling CaptureAsync. Al termine dell'acquisizione, chiama FinishAsync per terminare la sessione LowLagPhotoCapture e liberare le risorse associate.When you are done capturing, call FinishAsync to shut down the LowLagPhotoCapture session and free up the associated resources. Dopo aver chiamato FinishAsync, per riprendere ad acquisire foto dovrai chiamare ancora PrepareLowLagPhotoCaptureAsync per reinizializzare la sessione di acquisizione prima di chiamare CaptureAsync.After calling FinishAsync, to begin capturing photos again you will need to call PrepareLowLagPhotoCaptureAsync again to reinitialize the capture session before calling CaptureAsync.

// Prepare and capture photo
var lowLagCapture = await mediaCapture.PrepareLowLagPhotoCaptureAsync(ImageEncodingProperties.CreateUncompressed(MediaPixelFormat.Bgra8));

var capturedPhoto = await lowLagCapture.CaptureAsync();
var softwareBitmap = capturedPhoto.Frame.SoftwareBitmap;

await lowLagCapture.FinishAsync();

A partire da Windows, versione 1803, è possibile accedere alla proprietà bitmapProperties della classe CapturedFrame restituita da CaptureAsync per recuperare i metadati sulla foto acquisita.Starting with Windows, version 1803, you can access the BitmapProperties property of the CapturedFrame class returned from CaptureAsync to retrieve metadata about the captured photo. È possibile passare questi dati in un BitmapEncoder per salvare i metadati in un file.You can pass this data into a BitmapEncoder to save the metadata to a file. In precedenza, non era possibile accedere ai dati per i formati di immagine non compressi.Previously, there was no way to access this data for uncompressed image formats. È anche possibile accedere alla proprietà ControlValues per recuperare un oggetto CapturedFrameControlValues che descrive i valori del controllo, ad esempio l'esposizione e il bilanciamento del bianco, per il frame acquisito.You can also access the ControlValues property to retrieve a CapturedFrameControlValues object that describes the control values, such as exposure and white balance, for the captured frame.

Per informazioni sull'uso di BitmapEncoder e sull'uso dell'oggetto SoftwareBitmap , incluso come visualizzarne uno in una pagina XAML, vedere creare, modificare e salvare immagini bitmap.For information about using BitmapEncoder and about working with the SoftwareBitmap object, including how to display one in a XAML page, see Create, edit, and save bitmap images.

Per altre informazioni sull'impostazione dei valori di controllo del dispositivo di acquisizione, vedere acquisire i controlli del dispositivo per foto e video.For more information on setting capture device control values, see Capture device controls for photo and video.

A partire da Windows 10, versione 1803, è possibile ottenere i metadati, ad esempio le informazioni EXIF, per le foto acquisite in formato non compresso accedendo alla proprietà bitmapProperties di CapturedFrame restituita da MediaCapture.Starting with Windows 10, version 1803, you can get the metadata, such as EXIF information, for photos captured in uncompressed format by accessing the BitmapProperties property of the CapturedFrame returned by MediaCapture. Nelle versioni precedenti questi dati erano accessibili solo nell'intestazione delle foto acquisite in un formato di file compresso.In previous releases this data was only accessible in the header of photos captured to a compressed file format. È possibile fornire questi dati a un BitmapEncoder quando si scrive manualmente un file di immagine.You can provide this data to a BitmapEncoder when manually writing an image file. Per altre informazioni sulla codifica di bitmap, vedere creare, modificare e salvare immagini bitmap.For more information on encoding bitmaps, see Create, edit, and save bitmap images. È anche possibile accedere ai valori del controllo frame, ad esempio le impostazioni di esposizione e Flash, usati quando l'immagine è stata acquisita accedendo alla proprietà ControlValues .You can also access the frame control values, such as exposure and flash settings, used when the image was captured by accessing the ControlValues property. Per altre informazioni, vedere Capture Device Controls for Photo and video Capture.For more information, see Capture device controls for photo and video capture.

Acquisire una foto in un fileCapture a photo to a file

Una tipica app per le foto salverà una foto acquisita su disco o in un percorso di archiviazione cloud e dovrà aggiungere metadati al file, ad esempio l'orientamento della foto.A typical photography app will save a captured photo to disk or to cloud storage and will need to add metadata, such as photo orientation, to the file. L'esempio seguente illustra come acquisire una foto in un file.The following example shows you how to capture an photo to a file. Hai comunque ancora la possibilità di creare un SoftwareBitmap dal file di immagine in un momento successivo.You still have the option of creating a SoftwareBitmap from the image file later.

La tecnica descritta in questo esempio acquisisce la foto in un flusso in memoria e quindi transcodifica la foto dal flusso in un file su disco.The technique shown in this example captures the photo to an in-memory stream and then transcode the photo from the stream to a file on disk. Questo esempio usa GetLibraryAsync per ottenere la raccolta immagini dell'utente e quindi la proprietà SaveFolder per ottenere una cartella di salvataggio predefinita di riferimento.This example uses GetLibraryAsync to get the user's pictures library and then the SaveFolder property to get a reference default save folder. Non dimenticare di aggiungere la funzionalità Pictures Library al manifesto dell'app di accedere a questa cartella.Remember to add the Pictures Library capability to your app manifest to access this folder. CreateFileAsync crea un nuovo StorageFile in cui verrà salvata la foto.CreateFileAsync creates a new StorageFile to which the photo will be saved.

Creare un InMemoryRandomAccessStream e quindi chiamare CapturePhotoToStreamAsync per acquisire una foto nel flusso, passando il flusso e un oggetto ImageEncodingProperties specificando il formato dell'immagine da usare.Create an InMemoryRandomAccessStream and then call CapturePhotoToStreamAsync to capture a photo to the stream, passing in the stream and an ImageEncodingProperties object specifying the image format that should be used. È possibile creare proprietà di codifica personalizzate inizializzando l'oggetto personalmente, ma la classe fornisce metodi statici, ad esempio ImageEncodingProperties. CreateJpeg per i formati di codifica comuni.You can create custom encoding properties by initializing the object yourself, but the class provides static methods, like ImageEncodingProperties.CreateJpeg for common encoding formats. Successivamente, creare un flusso di file nel file di output chiamando OpenAsync.Next, create a file stream to the output file by calling OpenAsync. Crea un BitmapDecoder per decodificare l'immagine dal flusso in memoria e quindi crea un BitmapEncoder per codificare l'immagine in un file chiamando CreateForTranscodingAsync.Create a BitmapDecoder to decode the image from the in memory stream and then create a BitmapEncoder to encode the image to file by calling CreateForTranscodingAsync.

Facoltativamente, puoi creare un oggetto BitmapPropertySet e quindi chiamare SetPropertiesAsync sul codificatore di immagini per includere metadati relativi alla foto nel file di immagine.You can optionally create a BitmapPropertySet object and then call SetPropertiesAsync on the image encoder to include metadata about the photo in the image file. Per altre informazioni sulle proprietà di codifica, vedere metadati delle immagini.For more information about encoding properties, see Image metadata. Gestire correttamente l'orientamento del dispositivo è essenziale per la maggior parte delle app per le foto.Handling device orientation properly is essential for most photography apps. Per altre informazioni, vedere gestire l'orientamento del dispositivo con MediaCapture.For more information, see Handle device orientation with MediaCapture.

Infine, chiamare FlushAsync sull'oggetto Encoder per transcodificare la foto dal flusso in memoria al file.Finally, call FlushAsync on the encoder object to transcode the photo from the in-memory stream to the file.

var myPictures = await Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Pictures);
StorageFile file = await myPictures.SaveFolder.CreateFileAsync("photo.jpg", CreationCollisionOption.GenerateUniqueName);

using (var captureStream = new InMemoryRandomAccessStream())
{
    await mediaCapture.CapturePhotoToStreamAsync(ImageEncodingProperties.CreateJpeg(), captureStream);

    using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
    {
        var decoder = await BitmapDecoder.CreateAsync(captureStream);
        var encoder = await BitmapEncoder.CreateForTranscodingAsync(fileStream, decoder);

        var properties = new BitmapPropertySet {
            { "System.Photo.Orientation", new BitmapTypedValue(PhotoOrientation.Normal, PropertyType.UInt16) }
        };
        await encoder.BitmapProperties.SetPropertiesAsync(properties);

        await encoder.FlushAsync();
    }
}

Per ulteriori informazioni sull'utilizzo di file e cartelle, vedere file, cartelle e librerie.For more information about working with files and folders, see Files, folders, and libraries.

Acquisire un videoCapture a video

Puoi aggiungere rapidamente l'acquisizione video alla tua app usando la classe LowLagMediaRecording.Quickly add video capture to your app by using the LowLagMediaRecording class. Prima di tutto, dichiara una variabile di classe per l'oggetto.First, declare a class variable to for the object.

LowLagMediaRecording _mediaRecording;

Quindi, crea un oggetto StorageFile in cui verrà salvato il video.Next, create a StorageFile object to which the video will be saved. Tieni presente che per salvare nella raccolta di video dell'utente, come mostrato in questo esempio, devi aggiungere la funzionalità Catalogo video al manifesto dell'app.Note that to save to the user's video library, as shown in this example, you must add the Videos Library capability to your app manifest. Chiama PrepareLowLagRecordToStorageFileAsync per inizializzare la registrazione di file multimediali, passando il file di archiviazione e un oggetto MediaEncodingProfile che specifica la codifica per il video.Call PrepareLowLagRecordToStorageFileAsync to initialize the media recording, passing in the storage file and a MediaEncodingProfile object specifying the encoding for the video. La classe fornisce metodi statici, ad esempio CreateMp4, per la creazione di profili di codifica video comuni.The class provides static methods, like CreateMp4, for creating common video encoding profiles.

Infine, chiamare startAsync per avviare l'acquisizione del video.Finally, call StartAsync to begin capturing video.

var myVideos = await Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Videos);
StorageFile file = await myVideos.SaveFolder.CreateFileAsync("video.mp4", CreationCollisionOption.GenerateUniqueName);
_mediaRecording = await mediaCapture.PrepareLowLagRecordToStorageFileAsync(
        MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Auto), file);
await _mediaRecording.StartAsync();

Per arrestare la registrazione dei video, chiamare StopAsync.To stop recording video, call StopAsync.

await _mediaRecording.StopAsync();

Puoi continuare a chiamare StartAsync e StopAsync per acquisire altri video.You can continue to call StartAsync and StopAsync to capture additional videos. Al termine dell'acquisizione di video, chiama FinishAsync per terminare la sessione di acquisizione e rilasciare le risorse associate.When you are done capturing videos, call FinishAsync to dispose of the capture session and clean up associated resources. Dopo questa chiamata, devi chiamare nuovamente PrepareLowLagRecordToStorageFileAsync per reinizializzare la sessione di acquisizione prima di chiamare StartAsync.After this call, you must call PrepareLowLagRecordToStorageFileAsync again to reinitialize the capture session before calling StartAsync.

await _mediaRecording.FinishAsync();

Per l'acquisizione di video, dovresti registrare un gestore per l'evento RecordLimitationExceeded dell'oggetto MediaCapture, che verrà generato dal sistema operativo se si supera il limite per una singola registrazione, attualmente tre ore.When capturing video, you should register a handler for the RecordLimitationExceeded event of the MediaCapture object, which will be raised by the operating system if you surpass the limit for a single recording, currently three hours. Nel gestore per l'evento, è necessario finalizzare la registrazione chiamando StopAsync.In the handler for the event, you should finalize your recording by calling StopAsync.

mediaCapture.RecordLimitationExceeded += MediaCapture_RecordLimitationExceeded;
private async void MediaCapture_RecordLimitationExceeded(MediaCapture sender)
{
    await _mediaRecording.StopAsync();
    System.Diagnostics.Debug.WriteLine("Record limitation exceeded.");
}

Riprodurre e modificare i file video acquisitiPlay and edit captured video files

Dopo aver acquisito un video in un file, è possibile caricare il file e riprodurlo nell'interfaccia utente dell'app.Once you have captured a video to a file, you may want to load the file and play it back within your app's UI. Questa operazione può essere eseguita usando il controllo XAML di mediaplayerelement e un MediaPlayer associato.You can do this using the MediaPlayerElement XAML control and an associated MediaPlayer. Per informazioni sulla riproduzione di file multimediali in una pagina XAML, vedere riprodurre audio e video con MediaPlayer.For information on playing media in a XAML page, see Play audio and video with MediaPlayer.

È anche possibile creare un oggetto MediaClip da un file video chiamando CreateFromFileAsync.You can also create a MediaClip object from a video file by calling CreateFromFileAsync. Un MediaComposition offre funzionalità di base per la modifica dei video, come la disposizione della sequenza di oggetti MediaClip , la riduzione della lunghezza del video, la creazione di livelli, l'aggiunta di musica di sfondo e l'applicazione di effetti videoA MediaComposition provides basic video editing functionality like arranging the sequence of MediaClip objects, trimming video length, creating layers, adding background music, and applying video effects. Per altre informazioni sull'uso delle composizioni dei supporti, vedere composizioni multimediali e modifica.For more information on working with media compositions, see Media compositions and editing.

Sospendere e riprendere la registrazione di videoPause and resume video recording

È possibile sospendere una registrazione video e riprendere la registrazione senza creare un file di output separato chiamando PauseAsync e chiamando ResumeAsync.You can pause a video recording and then resume recording without creating a separate output file by calling PauseAsync and then calling ResumeAsync.

await _mediaRecording.PauseAsync(Windows.Media.Devices.MediaCapturePauseBehavior.ReleaseHardwareResources);
await _mediaRecording.ResumeAsync();

A partire da Windows 10 versione 1607, è possibile sospendere una registrazione video e ricevere l'ultimo fotogramma acquisito prima della sospensione.Starting with Windows 10, version 1607, you can pause a video recording and receive the last frame captured before the recording was paused. È quindi possibile sovrapporre questo fotogramma all'anteprima della fotocamera per consentire all'utente di allineare la fotocamera con il fotogramma in pausa prima di riprendere la registrazione.You can then overlay this frame on the camera preview to allow the user to align the camera with the paused frame before resuming recording. La chiamata a PauseWithResultAsync restituisce un oggetto MediaCapturePauseResult .Calling PauseWithResultAsync returns a MediaCapturePauseResult object. La proprietà LastFrame è un oggetto VideoFrame che rappresenta l'ultimo fotogramma.The LastFrame property is a VideoFrame object representing the last frame. Per visualizzare il fotogramma in XAML, ottieni la rappresentazione SoftwareBitmap del fotogramma video.To display the frame in XAML, get the SoftwareBitmap representation of the video frame. Attualmente sono supportate solo le immagini in formato BGRA8 con canale alfa premoltiplicato o vuoto, quindi se necessario chiama Convert per ottenere il formato corretto.Currently, only images in BGRA8 format with premultiplied or empty alpha channel are supported, so call Convert if necessary to get the correct format. Crea un nuovo oggetto SoftwareBitmapSource e chiama SetBitmapAsync per inizializzarlo.Create a new SoftwareBitmapSource object and call SetBitmapAsync to initialize it. Infine, imposta la proprietà Source di un controllo XAML Image per visualizzare l'immagine.Finally, set the Source property of a XAML Image control to display the image. Perché l'operazione funzioni, l'immagine deve essere allineata con l'oggetto CaptureElement e avere un valore di opacità minore di uno.For this trick to work, your image must be aligned with the CaptureElement control and should have an opacity value less than one. Non dimenticare che è possibile modificare solo l'interfaccia utente nel thread UI, quindi effettuare la chiamata all'interno di RunAsync.Don't forget that you can only modify the UI on the UI thread, so make this call inside RunAsync.

PauseWithResultAsync restituisce anche la durata del video registrato nel segmento precedente, nel caso in cui fosse necessario tenere traccia del tempo di registrazione totale.PauseWithResultAsync also returns the duration of the video that was recorded in the preceeding segment in case you need to track how much total time has been recorded.

MediaCapturePauseResult result = 
    await _mediaRecording.PauseWithResultAsync(Windows.Media.Devices.MediaCapturePauseBehavior.RetainHardwareResources);

var pausedFrame = result.LastFrame.SoftwareBitmap;
if(pausedFrame.BitmapPixelFormat != BitmapPixelFormat.Bgra8 || pausedFrame.BitmapAlphaMode != BitmapAlphaMode.Ignore)
{
    pausedFrame = SoftwareBitmap.Convert(pausedFrame, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore);
}

var source = new SoftwareBitmapSource();
await source.SetBitmapAsync(pausedFrame);

await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
    PauseImage.Source = source;
    PauseImage.Visibility = Visibility.Visible;
});

_totalRecordedTime += result.RecordDuration;

Quando riprendi la registrazione, puoi impostare l'origine dell'immagine su null e nasconderla.When you resume recording, you can set the source of the image to null and hide it.

await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
    PauseImage.Source = null;
    PauseImage.Visibility = Visibility.Collapsed;
});

await _mediaRecording.ResumeAsync();

Nota che è possibile ottenere un fotogramma risultato quando arresti il video chiamando StopWithResultAsync.Note that you can also get a result frame when you stop the video by calling StopWithResultAsync.

Acquisire audioCapture audio

Puoi aggiungere rapidamente l'acquisizione di audio alla tua app usando la stessa tecnica illustrata per l'acquisizione di video.You can quickly add audio capture to your app by using the same technique shown above for capturing video. L'esempio seguente crea uno StorageFile nella cartella dei dati dell'applicazione.The example below creates a StorageFile in the application data folder. Chiama PrepareLowLagRecordToStorageFileAsync per inizializzare la sessione di acquisizione, passando il file e un MediaEncodingProfile, che in questo esempio viene generato dal metodo statico CreateMp3.Call PrepareLowLagRecordToStorageFileAsync to initialize the capture session, passing in the file and a MediaEncodingProfile which is generated in this example by the CreateMp3 static method. Per iniziare la registrazione, chiama StartAsync.To begin recording, call StartAsync.

mediaCapture.RecordLimitationExceeded += MediaCapture_RecordLimitationExceeded;

var localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
StorageFile file = await localFolder.CreateFileAsync("audio.mp3", CreationCollisionOption.GenerateUniqueName);
_mediaRecording = await mediaCapture.PrepareLowLagRecordToStorageFileAsync(
        MediaEncodingProfile.CreateMp3(AudioEncodingQuality.High), file);
await _mediaRecording.StartAsync();

Chiamare StopAsync per arrestare la registrazione audio.Call StopAsync to stop the audio recording.

await _mediaRecording.StopAsync();

Puoi chiamare StartAsync e StopAsync più volte per registrare diversi file audio.You can call StartAsync and StopAsync multiple times to record several audio files. Al termine dell'acquisizione di audio, chiama FinishAsync per terminare la sessione di acquisizione e rilasciare le risorse associate.When you are done capturing audio, call FinishAsync to dispose of the capture session and clean up associated resources. Dopo questa chiamata, devi chiamare nuovamente PrepareLowLagRecordToStorageFileAsync per reinizializzare la sessione di acquisizione prima di chiamare StartAsync.After this call, you must call PrepareLowLagRecordToStorageFileAsync again to reinitialize the capture session before calling StartAsync.

await _mediaRecording.FinishAsync();

Rilevare e rispondere alle modifiche del livello audio da parte del sistemaDetect and respond to audio level changes by the system

A partire da Windows 10, versione 1803, l'app può rilevare quando il sistema abbassa o disattiva il livello audio dei flussi di acquisizione audio e di rendering audio dell'app.Starting with Windows 10, version 1803, your app can detect when the system lowers or mutes the audio level of your app's audio capture and audio render streams. Ad esempio, il sistema potrebbe disattivare i flussi dell'app quando entra in background.For example, the system may mute your app's streams when it goes into the background. La classe AudioStateMonitor consente di eseguire la registrazione per ricevere un evento quando il sistema modifica il volume di un flusso audio.The AudioStateMonitor class allows you to register to receive an event when the system modifies the volume of an audio stream. Ottenere un'istanza di AudioStateMonitor per il monitoraggio dei flussi di acquisizione audio chiamando CreateForCaptureMonitoring.Get an instance of AudioStateMonitor for monitoring audio capture streams by calling CreateForCaptureMonitoring. Ottenere un'istanza per il monitoraggio dei flussi di rendering audio chiamando CreateForRenderMonitoring.Get an instance for monitoring audio render streams by calling CreateForRenderMonitoring. Registrare un gestore per l'evento SoundLevelChanged di ogni monitoraggio per ricevere una notifica quando l'audio per la categoria di flusso corrispondente viene modificato dal sistema.Register a handler for the SoundLevelChanged event of each monitor to be notified when the audio for the corresponding stream category is changed by the system.

// Namespaces for monitoring audio state
using Windows.Media;
using Windows.Media.Audio;
AudioStateMonitor captureAudioStateMonitor;
AudioStateMonitor renderAudioStateMonitor;
captureAudioStateMonitor = AudioStateMonitor.CreateForCaptureMonitoring();
captureAudioStateMonitor.SoundLevelChanged += CaptureAudioStateMonitor_SoundLevelChanged; ;

renderAudioStateMonitor = AudioStateMonitor.CreateForRenderMonitoring();
renderAudioStateMonitor.SoundLevelChanged += RenderAudioStateMonitor_SoundLevelChanged; ;

Nel gestore SoundLevelChanged per il flusso di acquisizione, è possibile controllare la proprietà soundLevel del mittente AudioStateMonitor per determinare il nuovo livello di suono.In the SoundLevelChanged handler for the capture stream, you can check the SoundLevel property of the AudioStateMonitor sender to determine the new sound level. Si noti che un flusso di acquisizione non dovrebbe mai essere abbassato di livello o "ducked" dal sistema.Note that a capture stream should never be lowered, or "ducked", by the system. Dovrebbe essere sempre disattivato o ritornato a volume intero.It should only ever be muted or switched back to full volume. Se il flusso audio è disattivato, è possibile arrestare un'acquisizione in corso.If the audio stream is muted, you can stop a capture in progress. Se il flusso audio viene ripristinato in un volume intero, è possibile avviare di nuovo l'acquisizione.If the audio stream is restored to full volume, you can start capturing again. L'esempio seguente usa alcune variabili di classe booleane per verificare se l'app sta attualmente acquisendo audio e se l'acquisizione è stata interrotta a causa della modifica dello stato audio.The following example uses some boolean class variables to track whether the app is currently capturing audio and if the capture was stopped due to the audio state change. Queste variabili vengono usate per determinare quando è opportuno arrestare o avviare l'acquisizione audio a livello di codice.These variables are used to determine when it's appropriate to programmatically stop or start audio capture.

bool isCapturingAudio = false;
bool capturingStoppedForAudioState = false;
private void CaptureAudioStateMonitor_SoundLevelChanged(AudioStateMonitor sender, object args)
{
    switch (sender.SoundLevel)
    {
        case SoundLevel.Full:
            if(capturingStoppedForAudioState)
            {
                StartAudioCapture();
                capturingStoppedForAudioState = false;
            }  
            break;
        case SoundLevel.Muted:
            if(isCapturingAudio)
            {
                StopAudioCapture();
                capturingStoppedForAudioState = true;
            }
            break;
        case SoundLevel.Low:
            // This should never happen for capture
            Debug.WriteLine("Unexpected audio state.");
            break;
    }
}

Nell'esempio di codice seguente viene illustrata un'implementazione del gestore SoundLevelChanged per il rendering audio.The following code example illustrates an implementation of the SoundLevelChanged handler for audio rendering. A seconda dello scenario dell'app e del tipo di contenuto che si sta riproducendo, potrebbe essere necessario sospendere la riproduzione audio quando il livello del suono viene sottoposto a ducking.Depending on your app scenario, and the type of content you are playing, you may want to pause audio playback when the sound level is ducked. Per altre informazioni sulla gestione delle modifiche a livello di suono per la riproduzione di contenuti multimediali, vedere riprodurre audio e video con MediaPlayer.For more information on handling sound level changes for media playback, see Play audio and video with MediaPlayer.

private void RenderAudioStateMonitor_SoundLevelChanged(AudioStateMonitor sender, object args)
{
    if ((sender.SoundLevel == SoundLevel.Full) ||
  (sender.SoundLevel == SoundLevel.Low && !isPodcast))
    {
        mediaPlayer.Play();
    }
    else if ((sender.SoundLevel == SoundLevel.Muted) ||
         (sender.SoundLevel == SoundLevel.Low && isPodcast))
    {
        // Pause playback if we’re muted or if we’re playing a podcast and are ducked
        mediaPlayer.Pause();
    }
}