Captura básica de fotos, audio y vídeo con MediaCaptureBasic photo, video, and audio capture with MediaCapture

Este artículo muestra la forma más sencilla de capturar fotos y vídeos mediante la clase MediaCapture.This article shows the simplest way to capture photos and video using the MediaCapture class. La clase MediaCapture expone un eficaz conjunto de API que proporciona control de bajo nivel sobre la canalización de captura y habilita escenarios de captura avanzados, pero este artículo está pensado para ayudar a agregar la captura multimedia básica a la aplicación de forma rápida y fácil.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. Para obtener más información sobre otras características que proporciona MediaCapture, consulta Cámara.To learn about more of the features that MediaCapture provides, see Camera.

Si simplemente deseas capturar una foto o un vídeo y no quieres agregar otras características de captura multimedia, o si no deseas crear tu propia interfaz de usuario de cámara, es aconsejable usar la clase CameraCaptureUI, que te permite simplemente iniciar la aplicación de cámara integrada de Windows y recibir el archivo de foto o vídeo que se captura.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. Para obtener más información, consulta Capturar fotografías y vídeos con la interfaz de usuario de la cámara integrada de Windows.For more information, see Capture photos and video with Windows built-in camera UI

El código de este artículo es una adaptación de la muestra del Camera starter kit (Starter Kit de la cámara).The code in this article was adapted from the Camera starter kit sample. Puedes descargar la muestra para ver el código usado en contexto o para emplearla como punto de partida para tu propia aplicación.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.

Agregar declaraciones de funcionalidades al manifiesto de la aplicaciónAdd capability declarations to the app manifest

Para que tu aplicación tenga acceso a la cámara de un dispositivo, debes declarar que esta usa las funcionalidades webcam y microphone 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. Si quieres guardar las fotos y los vídeos capturados en la biblioteca de imágenes de los usuarios, también debes declarar las funcionalidades picturesLibrary y 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.

Agregar funcionalidades al manifiesto de la aplicaciónTo add capabilities to the app manifest

  1. En Microsoft Visual Studio, en el Explorador de soluciones, abre el diseñador para el manifiesto de la aplicación haciendo doble clic en el elemento package.appxmanifest.In Microsoft Visual Studio, in Solution Explorer, open the designer for the application manifest by double-clicking the package.appxmanifest item.
  2. Seleccione la pestaña Funcionalidades.Select the Capabilities tab.
  3. Active la casilla de la cámara web y el cuadro de micrófono.Check the box for Webcam and the box for Microphone.
  4. Para obtener acceso a la biblioteca de imágenes y vídeos, marca las casillas de Biblioteca de imágenes y de Biblioteca de vídeos.For access to the Pictures and Videos library check the boxes for Pictures Library and the box for Videos Library.

Inicializar el objeto MediaCaptureInitialize the MediaCapture object

Todos los métodos de captura que se describe en este artículo requieren el primer paso de inicializar el objeto MediaCapture mediante una llamada al constructor y, a continuación, llamar a 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. Dado que se accederá al objeto MediaCapture desde varias ubicaciones de la aplicación, declara una variable de clase para que contenga el objeto.Since the MediaCapture object will be accessed from multiple places in your app, declare a class variable to hold the object. Implementa un controlador para el evento Failed del objeto MediaCapture para recibir una notificación si se produce un error en una operación de captura.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;

Configurar la vista previa de la cámaraSet up the camera preview

Es posible capturar fotos, vídeos y audio usando MediaCapture sin mostrar la vista previa de la cámara, pero lo normal es que desees mostrar la vista previa de la secuencia para que el usuario pueda ver lo que se captura.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. Además, algunas características de MediaCapture requieren que se ejecute la vista previa de la secuencia para poder habilitarlas, incluidos el enfoque automático, la exposición automática y el balance de blancos automático.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. Para ver cómo configurar la vista previa de la cámara, consulta Mostrar la vista previa de la cámara.To see how to set up the camera preview, see Display the camera preview.

Capturar una foto en un objeto SoftwareBitmapCapture a photo to a SoftwareBitmap

La clase SoftwareBitmap se introdujo en Windows 10 para proporcionar una representación común de las imágenes en distintas características.The SoftwareBitmap class was introduced in Windows 10 to provide a common representation of images across multiple features. Si quieres capturar una foto y usar inmediatamente la imagen capturada en la aplicación, como mostrarla en XAML, en lugar de capturarla en un archivo, deberías capturarla en un objeto 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. Seguirás teniendo la opción de guardar dicha imagen en el disco más adelante.You still have the option of saving the image to disk later.

Tras inicializar el objeto MediaCapture, puedes capturar una foto en un objeto SoftwareBitmap mediante la clase LowLagPhotoCapture.After initializing the MediaCapture object, you can capture a photo to a SoftwareBitmap using the LowLagPhotoCapture class. Para obtener una instancia de esta clase, llama a PrepareLowLagPhotoCaptureAsync, pasando un objeto ImageEncodingProperties que especifique el formato de imagen que desees.Get an instance of this class by calling PrepareLowLagPhotoCaptureAsync, passing in an ImageEncodingProperties object specifying the image format you want. CreateUncompressed crea una codificación sin comprimir con el formato de píxeles especificado.CreateUncompressed creates an uncompressed encoding with the specified pixel format. Para capturar una foto, llama a CaptureAsync, lo que devolverá un objeto CapturedPhoto.Capture a photo by calling CaptureAsync, which returns a CapturedPhoto object. Para obtener un objeto SoftwareBitmap, accede a la propiedad Frame y luego a la propiedad SoftwareBitmap.Get a SoftwareBitmap by accessing the Frame property and then the SoftwareBitmap property.

Si lo deseas, puedes capturar varias fotos si llamas repetidamente a CaptureAsync.If you want, you can capture multiple photos by repeatedly calling CaptureAsync. Cuando hayas terminado de capturar, llama a FinishAsync para cerrar la sesión de LowLagPhotoCapture y liberar los recursos asociados.When you are done capturing, call FinishAsync to shut down the LowLagPhotoCapture session and free up the associated resources. Tras llamar a FinishAsyncpara, si deseas volver a empezar a capturar fotos, deberás llamar a PrepareLowLagPhotoCaptureAsync otra vez para reinicializar la sesión de captura antes de llamar a 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 partir de Windows, versión 1803, puede tener acceso a la propiedad BitmapProperties de la clase CapturedFrame devuelta desde CaptureAsync para recuperar los metadatos sobre la foto capturada.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. Puede pasar estos datos a un BitmapEncoder para guardar los metadatos en un archivo.You can pass this data into a BitmapEncoder to save the metadata to a file. Anteriormente, no había forma de tener acceso a estos datos para los formatos de imagen no comprimidos.Previously, there was no way to access this data for uncompressed image formats. También puede tener acceso a la propiedad ControlValues para recuperar un objeto CapturedFrameControlValues que describe los valores de control, como la exposición y el balance de blanco, para el fotograma capturado.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.

Para obtener información sobre cómo usar BitmapEncoder y sobre cómo trabajar con el objeto SoftwareBitmap , incluido cómo mostrar uno en una página XAML, vea crear, editar y guardar imágenes de mapa de bits.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.

Para obtener más información sobre la configuración de los valores de control de dispositivos de captura, consulte capturar controles de dispositivo para fotos y vídeos.For more information on setting capture device control values, see Capture device controls for photo and video.

A partir de la versión 1803 de Windows 10, puede obtener los metadatos, como la información EXIF, para las fotos capturadas en formato sin comprimir mediante el acceso a la propiedad BitmapProperties del CapturedFrame devuelto por 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. En versiones anteriores, solo se podía tener acceso a estos datos en el encabezado de las fotos capturadas en un formato de archivo comprimido.In previous releases this data was only accessible in the header of photos captured to a compressed file format. Puede proporcionar estos datos a un BitmapEncoder cuando escribe manualmente un archivo de imagen.You can provide this data to a BitmapEncoder when manually writing an image file. Para obtener más información sobre la codificación de mapas de bits, vea crear, editar y guardar imágenes de mapa de bits.For more information on encoding bitmaps, see Create, edit, and save bitmap images. También puede tener acceso a los valores de control de marco, como la configuración de exposición y Flash, que se usa cuando se captura la imagen mediante el acceso a la propiedad 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. Para obtener más información, vea capturar controles de dispositivo para la captura de fotos y vídeos.For more information, see Capture device controls for photo and video capture.

Capturar una foto a un archivoCapture a photo to a file

Una aplicación de fotografía típica guardará una foto en el disco o en el almacenamiento en la nube y tendrá que agregar metadatos al archivo, como la orientación de la fotografía.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. El siguiente ejemplo muestra cómo capturar una foto en un archivo.The following example shows you how to capture an photo to a file. Seguirás teniendo la opción de crear un objeto SoftwareBitmap a partir del archivo de imagen más adelante.You still have the option of creating a SoftwareBitmap from the image file later.

La técnica que se muestra en este ejemplo captura la foto en una secuencia de memoria y, a continuación, transcodifica la foto desde dicha secuencia a un archivo del 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. Este ejemplo usa GetLibraryAsync para obtener la biblioteca de imágenes del usuario y luego la propiedad SaveFolder para conseguir una carpeta para guardar predeterminada de referencia.This example uses GetLibraryAsync to get the user's pictures library and then the SaveFolder property to get a reference default save folder. Recuerda que tienes que agregar la funcionalidad Pictures Library al manifiesto de la aplicación para acceder a esta carpeta.Remember to add the Pictures Library capability to your app manifest to access this folder. CreateFileAsync crea un nuevo objeto StorageFile en el que se guardará la foto capturada.CreateFileAsync creates a new StorageFile to which the photo will be saved.

Crea un objeto InMemoryRandomAccessStream y, a continuación, llama a CapturePhotoToStreamAsync para capturar una foto en la secuencia, pasando la secuencia y un objeto ImageEncodingProperties que especifique el formato de imagen que debe usarse.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. Puedes crear propiedades de codificación personalizadas si inicializas el objeto por ti mismo, pero la clase proporciona métodos estáticos, como ImageEncodingProperties.CreateJpeg, para formatos de codificación comunes.You can create custom encoding properties by initializing the object yourself, but the class provides static methods, like ImageEncodingProperties.CreateJpeg for common encoding formats. A continuación, crea una secuencia de archivos en el archivo de salida llamando a OpenAsync.Next, create a file stream to the output file by calling OpenAsync. Crea un objeto BitmapDecoder para descodificar la imagen de la secuencia de memoria y, a continuación, crea un objeto BitmapEncoder para codificar la imagen en el archivo mediante una llamada a 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.

También tienes la opción de crear un objeto BitmapPropertySet y luego llamar a SetPropertiesAsync en el codificador de imágenes para incluir metadatos sobre la foto en el archivo de imagen.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. Para obtener más información sobre las propiedades de codificación, consulta Metadatos de imagen.For more information about encoding properties, see Image metadata. Administrar la orientación del dispositivo correctamente es esencial para la mayoría de las aplicaciones de fotografía.Handling device orientation properly is essential for most photography apps. Para obtener más información, consulta Controlar la orientación del dispositivo con MediaCapture.For more information, see Handle device orientation with MediaCapture.

Por último, llama a FlushAsync en el objeto del codificador para transcodificar la foto desde la secuencia de memoria al archivo.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();
    }
}

Para obtener más información sobre cómo trabajar con archivos y carpetas, consulta Archivos, carpetas y bibliotecas.For more information about working with files and folders, see Files, folders, and libraries.

Capturar un vídeoCapture a video

Agrega rápidamente la captura de vídeo a tu aplicación mediante la clase LowLagMediaRecording.Quickly add video capture to your app by using the LowLagMediaRecording class. En primer lugar, declara una variable de clase para el objeto.First, declare a class variable to for the object.

LowLagMediaRecording _mediaRecording;

A continuación, crea un objeto StorageFile en el que se guardará el vídeo.Next, create a StorageFile object to which the video will be saved. Ten en cuenta que para guardar en la biblioteca de vídeos del usuario, como se muestra en este ejemplo, debes agregar la funcionalidad Videos Library al manifiesto de la aplicación.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. Llama a PrepareLowLagRecordToStorageFileAsync para inicializar la grabación multimedia, pasando el archivo de almacenamiento y un objeto MediaEncodingProfile que especifique la codificación del vídeo.Call PrepareLowLagRecordToStorageFileAsync to initialize the media recording, passing in the storage file and a MediaEncodingProfile object specifying the encoding for the video. La clase proporciona métodos estáticos, como CreateMp4, para crear perfiles de las codificaciones de vídeo más comunes.The class provides static methods, like CreateMp4, for creating common video encoding profiles.

Por último, llama a StartAsync para empezar a capturar vídeo.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();

Para detener la grabación de vídeo, llama a StopAsync.To stop recording video, call StopAsync.

await _mediaRecording.StopAsync();

Puedes seguir llamando a StartAsync y StopAsync para capturar más vídeos.You can continue to call StartAsync and StopAsync to capture additional videos. Cuando hayas terminado de capturar vídeos, llama a FinishAsync para desechar la sesión de captura y limpiar los recursos asociados.When you are done capturing videos, call FinishAsync to dispose of the capture session and clean up associated resources. Después de esta llamada, debes llamar a PrepareLowLagRecordToStorageFileAsync otra vez para reinicializar la sesión de captura antes de llamar a StartAsync.After this call, you must call PrepareLowLagRecordToStorageFileAsync again to reinitialize the capture session before calling StartAsync.

await _mediaRecording.FinishAsync();

A la hora de capturar un vídeo, debes registrar un controlador para el evento RecordLimitationExceeded del objeto MediaCapture, que el sistema operativo generará si se supera el límite para una única grabación, actualmente 3 horas como máximo.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. En el controlador del evento, se deberá finalizar la grabación con una llamada a 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.");
}

Reproducir y editar archivos de vídeo capturadosPlay and edit captured video files

Una vez que haya capturado un vídeo en un archivo, puede que desee cargar el archivo y reproducirlo en la interfaz de usuario de la aplicación.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. Para ello, puede usar el control XAML de MediaPlayerElement y un objeto MediaPlayer asociado.You can do this using the MediaPlayerElement XAML control and an associated MediaPlayer. Para obtener información sobre cómo reproducir archivos multimedia en una página XAML, vea reproducir audio y vídeo con MediaPlayer.For information on playing media in a XAML page, see Play audio and video with MediaPlayer.

También puede crear un objeto MediaClip desde un archivo de vídeo llamando a CreateFromFileAsync.You can also create a MediaClip object from a video file by calling CreateFromFileAsync. Un objeto MediaComposition proporciona funcionalidad básica de edición de vídeo, como organizar la secuencia de objetos MediaClip , recortar la longitud del vídeo, crear capas, agregar música de fondo y aplicar efectos de vídeo.A 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. Para obtener más información sobre cómo trabajar con composiciones multimedia, consulte composiciones y edición de elementos multimedia.For more information on working with media compositions, see Media compositions and editing.

Pausar y reanudar la grabación de vídeoPause and resume video recording

Puedes pausar una grabación de vídeo y luego reanudarla sin tener que crear un archivo de salida independiente mediante una llamada a PauseAsync y, a continuación, una llamada a 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 partir de Windows 10, versión 1607, puedes pausar una grabación de vídeo y recibir el último fotograma capturado antes de que se haya pausado dicha grabación.Starting with Windows 10, version 1607, you can pause a video recording and receive the last frame captured before the recording was paused. A continuación, se puede superponer este fotograma en la vista previa de la cámara para permitir al usuario alinear la cámara con el fotograma en pausa antes de reanudar la grabación.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. Una llamada a PauseWithResultAsync devuelve un objeto MediaCapturePauseResult.Calling PauseWithResultAsync returns a MediaCapturePauseResult object. La propiedad LastFrame es un objeto VideoFrame que representa el último fotograma.The LastFrame property is a VideoFrame object representing the last frame. Para mostrar el fotograma en XAML, obtén la representación de SoftwareBitmap del fotograma de vídeo.To display the frame in XAML, get the SoftwareBitmap representation of the video frame. Actualmente, solo se admiten imágenes en formato BGRA8 con canal alfa premultiplicado o vacío, por lo que debes llamar a Convert si es necesario para obtener el formato correcto.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 nuevo objeto SoftwareBitmapSource y llama a SetBitmapAsync para inicializarlo.Create a new SoftwareBitmapSource object and call SetBitmapAsync to initialize it. Por último, establece la propiedad Source de un control Image de XAML para mostrar la imagen.Finally, set the Source property of a XAML Image control to display the image. Para que esto funcione, la imagen debe estar alineada con el control CaptureElement y debe poseer un valor de opacidad inferior a 1.For this trick to work, your image must be aligned with the CaptureElement control and should have an opacity value less than one. No olvides que solo puedes modificar la interfaz de usuario en el subproceso de la interfaz de usuario, por lo que debes hacer esta llamada dentro de RunAsync.Don't forget that you can only modify the UI on the UI thread, so make this call inside RunAsync.

PauseWithResultAsync también devuelve la duración del vídeo que se haya grabado en el segmento anterior, en caso de que debas controlar cuánto tiempo se ha grabado en total.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;

Al reanudar la grabación, puedes establecer el origen de la imagen en null y ocultarla.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();

Ten en cuenta que también puedes obtener un fotograma de resultado si detienes el vídeo mediante una llamada a StopWithResultAsync.Note that you can also get a result frame when you stop the video by calling StopWithResultAsync.

Capturar audioCapture audio

Puedes agregar rápidamente captura de audio a tu aplicación mediante el uso de la misma técnica que se muestra anteriormente para la captura de vídeo.You can quickly add audio capture to your app by using the same technique shown above for capturing video. El ejemplo que se muestra a continuación crea un objeto StorageFile en la carpeta de datos de la aplicación.The example below creates a StorageFile in the application data folder. Llama a PrepareLowLagRecordToStorageFileAsync para inicializar la sesión de captura, pasando el archivo y un objeto MediaEncodingProfile, que en este ejemplo lo genera el método estático 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. Para comenzar la grabación, llama a 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();

Llama a StopAsync para detener la grabación de audio.Call StopAsync to stop the audio recording.

await _mediaRecording.StopAsync();

Puedes llamar a StartAsync y StopAsync varias veces para grabar varios archivos de audio.You can call StartAsync and StopAsync multiple times to record several audio files. Cuando hayas terminado de capturar audio, llama a FinishAsync para desechar la sesión de captura y limpiar los recursos asociados.When you are done capturing audio, call FinishAsync to dispose of the capture session and clean up associated resources. Después de esta llamada, debes llamar a PrepareLowLagRecordToStorageFileAsync otra vez para reinicializar la sesión de captura antes de llamar a StartAsync.After this call, you must call PrepareLowLagRecordToStorageFileAsync again to reinitialize the capture session before calling StartAsync.

await _mediaRecording.FinishAsync();

Detectar y responder a los cambios de nivel de audio por parte del sistemaDetect and respond to audio level changes by the system

A partir de Windows 10, versión 1803, la aplicación puede detectar cuándo el sistema reduce o silencia el nivel de audio de las secuencias de audio y captura de audio de la aplicación.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. Por ejemplo, el sistema puede silenciar los flujos de la aplicación cuando entra en segundo plano.For example, the system may mute your app's streams when it goes into the background. La clase AudioStateMonitor permite registrarse para recibir un evento cuando el sistema modifica el volumen de una secuencia de audio.The AudioStateMonitor class allows you to register to receive an event when the system modifies the volume of an audio stream. Obtener una instancia de AudioStateMonitor para supervisar las secuencias de captura de audio llamando a CreateForCaptureMonitoring.Get an instance of AudioStateMonitor for monitoring audio capture streams by calling CreateForCaptureMonitoring. Obtenga una instancia de para supervisar las secuencias de representación de audio llamando a CreateForRenderMonitoring.Get an instance for monitoring audio render streams by calling CreateForRenderMonitoring. Registra un controlador para el evento SoundLevelChanged de cada monitor que se va a notificar cuando el sistema cambie el audio de la categoría de flujo correspondiente.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; ;

En el controlador SoundLevelChanged del flujo de captura, puede comprobar la propiedad SoundLevel del remitente AudioStateMonitor para determinar el nuevo nivel de sonido.In the SoundLevelChanged handler for the capture stream, you can check the SoundLevel property of the AudioStateMonitor sender to determine the new sound level. Tenga en cuenta que el sistema nunca debe reducir ni "pato" un flujo de captura.Note that a capture stream should never be lowered, or "ducked", by the system. Nunca se debe silenciar o volver a cambiar al volumen completo.It should only ever be muted or switched back to full volume. Si la secuencia de audio está silenciada, puede detener una captura en curso.If the audio stream is muted, you can stop a capture in progress. Si la secuencia de audio se restaura en el volumen completo, puede volver a iniciar la captura.If the audio stream is restored to full volume, you can start capturing again. En el ejemplo siguiente se usan algunas variables de clase booleana para realizar el seguimiento de si la aplicación está capturando audio y si la captura se detuvo debido al cambio de estado de 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. Estas variables se usan para determinar cuándo es adecuado detener o iniciar la captura de audio mediante programación.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;
    }
}

En el ejemplo de código siguiente se muestra una implementación del controlador SoundLevelChanged para la representación de audio.The following code example illustrates an implementation of the SoundLevelChanged handler for audio rendering. En función del escenario de la aplicación y del tipo de contenido que esté reproduciendo, puede que quiera pausar la reproducción de audio cuando el nivel de sonido esté sobrescrito.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. Para obtener más información sobre cómo controlar los cambios de nivel de sonido para la reproducción multimedia, consulte reproducir audio y vídeo 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();
    }
}