Idioma: HTML | XAML

Cómo reproducir audio en segundo plano (XAML)

Applies to Windows only

Para reproducir audio en segundo plano, declara la tarea en segundo plano Audio y controla los botones de SystemMediaTransportControls.

Importante  Windows 8.1 introduce la clase SystemMediaTransportControls, que sustituye a la clase MediaControl. Deberías usar SystemMediaTransportControls en tu aplicación.
Nota  Si una secuencia de vídeo está habilitada para reproducirse en segundo plano, cuando la aplicación cambie a segundo plano podrás oír el audio, pero no verás el vídeo. Esta es la forma en que se ha diseñado. De este modo se reducen los requisitos de energía del dispositivo mientras reproduce el vídeo en segundo plano.

Para ver esta función en acción como parte de una muestra de reproducción de multimedia completa, consulta Reproducción de multimedia, de principio a fin.

Requisitos previos

En este tema se supone que ya sabes cómo crear una aplicación de la Tienda Windows básica con C++, C# o Visual Basic. Si necesitas ayuda para crear tu primera aplicación, consulta Crear la primera aplicación de la Tienda Windows con C# o Visual Basic.

En este tema se supone que conoces la clase MediaElement. Para ver un tema de introducción sobre el uso de la clase MediaElement, consulta Inicio rápido: vídeo y audio.

Instrucciones

Paso 1: Declarar la tarea de audio en segundo plano

Deberás declarar explícitamente que tu aplicación realizará tareas en segundo plano.

  1. Abre el archivo del proyecto de tu aplicación en Microsoft Visual Studio.
  2. Haz doble clic en el archivo Package.appmanifest en el Explorador de soluciones para abrir el cuadro de diálogo Package.appmanifest.
  3. Haz clic en la pestaña Declaraciones y selecciona Tareas en segundo plano en el cuadro desplegable Declaraciones disponibles.
  4. Haz clic en Agregary, a continuación, clic en la casilla Audio.

    También puedes hacer una declaración en segundo plano de una secuencia de vídeo usando el mismo archivo de manifiesto que creaste para el audio en los pasos anteriores. Para hacerlo, establece el atributo "Task Type" en audio.

  5. Especifica el punto de entrada. En la mayoría de los casos, si el proyecto se denomina Foo, deberás especificar Foo.App.

Paso 2: Establecer AudioCategory

Establece la propiedad AudioCategory de MediaElement en Communications o en BackgroundCapableMedia. También puedes especificar esta propiedad en código.

El siguiente código XAML crea un MediaElement y establece AudioCategory en BackgroundCapableMedia.


<MediaElement Name="media" 
              AudioCategory="BackgroundCapableMedia" 
              Source="Somesong.mp3" />


Paso 3: Compatibilidad con SystemMediaTransportControls

Windows 8.1 introduce la clase SystemMediaTransportControls, que sustituye a la clase MediaControl. Deberías usar SystemMediaTransportControls en tu aplicación. Para ser más exactos, los pasos para implementar la compatibilidad con audio en segundo plano con MediaControl se incluyen a continuación, pero solo deberías usar SystemMediaTransportControls. Consulta Cómo usar los controles de transporte multimedia del sistema para ver una explicación más exhaustiva sobre el uso de SystemMediaTransportControls.

Incluso si se declara la aplicación para reproducir audio en segundo plano, la aplicación deberá habilitar los botones de reproducir y pausar de SystemMediaTransportControls mediante la configuración de IsPlayEnabled y IsPauseEnabled en true. La aplicación también debe controlar el evento ButtonPressed, que notifica a la aplicación cuando se presionan los botones de los controles de transporte multimedia del sistema. Al proporcionar esta compatibilidad mínima con el control de eventos, permites que el usuario reproduzca o pause el audio sin llevar la aplicación a primer plano.

Para actualizar los objetos en el subproceso de la interfaz de usuario desde el controlador de eventos ButtonPressed, como el objeto MediaElement, deberás calcular las llamadas mediante el CoreDispatcher. Esto se debe a que no se llamará al controlador de eventos ButtonPressed desde el subproceso de la interfaz de usuario. Y solo el subproceso de la interfaz de usuario puede modificar objetos en este subproceso. Si intentas modificar objetos de la interfaz de usuario desde un subproceso que no es de interfaz de usuario, se generará una excepción. En el siguiente código de ejemplo se muestra cómo hacer esto:

Además de controlar el evento ButtonPressed, también debes notificar a SystemMediaTransportControls cuando cambia el estado multimedia, como cuando está en pausa o en reproducción. Para notificar a SystemMediaTransportControl sobre los cambios en el estado multimedia, establece su propiedad PlaybackStatus en uno de los valores de MediaPlaybackStatus.

Con el siguiente código se configura SystemMediaTransportControls en una aplicación que ejecuta audio en segundo plano. El código lleva a cabo los siguientes pasos.

Este es el código que crea MediaElement.


<MediaElement x:Name="musicPlayer" 
          Source="Music/music1.mp3"
          AudioCategory="BackgroundCapableMedia"
          CurrentStateChanged="MusicPlayer_CurrentStateChanged" />


Este es el código que configura los SystemMediaTransportControls.


SystemMediaTransportControls systemControls;

void InitializeTransportControls()
{
    // Hook up app to system transport controls.
    systemControls = SystemMediaTransportControls.GetForCurrentView();
    systemControls.ButtonPressed += SystemControls_ButtonPressed;

    // Register to handle the following system transpot control buttons.
    systemControls.IsPlayEnabled = true;
    systemControls.IsPauseEnabled = true;
}


Este es el código que controla el evento CurrentStateChanged de MediaElement y actualiza la propiedad PlaybackStatus de SystemMediaTransportControls.


void MusicPlayer_CurrentStateChanged(object sender, RoutedEventArgs e)
{
    switch (musicPlayer.CurrentState)
    {
        case MediaElementState.Playing:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Playing;
            break;
        case MediaElementState.Paused:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Paused;
            break;
        case MediaElementState.Stopped:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Stopped;
            break;
        case MediaElementState.Closed:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Closed;
            break;
        default:
            break;
    }
}


Este es el código para que los métodos auxiliares y el controlador de eventos de ButtonPressed reproduzcan y pausen el MediaElement. Se observa que las llamadas a Play y Pause se envían al subproceso de la interfaz de usuario a través de CoreDispatcher mediante Dispatcher.RunAsync.


void SystemControls_ButtonPressed(SystemMediaTransportControls sender,
    SystemMediaTransportControlsButtonPressedEventArgs args)
{
    switch (args.Button)
    {
        case SystemMediaTransportControlsButton.Play:
            PlayMedia();
            break;
        case SystemMediaTransportControlsButton.Pause:
            PauseMedia();
            break;
        default:
            break;
    }
}

async void PlayMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        musicPlayer.Play();
    });
}

async void PauseMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        musicPlayer.Pause();
    });
}


Para obtener más información sobre SystemMediaTransportControl, consulta el tema sobre cómo usar los controles de transporte multimedia del sistema y la muestra de SystemMediaTransportControls

Paso 4: Registrar controladores en MediaControl (solo en Windows 8)

Importante  

MediaControl ha sido sustituido en Windows 8.1 SystemMediaTransportControl. Debes usar SystemMediaTransportControl en su lugar.

Aunque una aplicación esté registrada para reproducir música o vídeo en segundo plano, la aplicación debe controlar los siguientes eventos MediaControl: PlayPressed, PausePressed, StopPressed y PlayPauseTogglePressed. Al proporcionar esta compatibilidad mínima con el control de eventos, permites que el usuario reproduzca o pause la secuencia de música o vídeo en segundo plano sin llevar la aplicación a primer plano.

Es probable que muchas veces quieras crear controles de transporte (botones para reproducir, detener y pausar), para controlar MediaElement. Este artículo no proporciona esta información , pero podrás obtener ejemplos en Inicio rápido: vídeo y audio e Inicio rápido: crear una aplicación de reproductor multimedia.

MediaControl es una clase estática, por eso solo tienes que agregar los controladores de eventos directamente en los eventos de la clase.

  1. En el panel del Explorador de soluciones, haz clic en el archivo C# de tu aplicación para abrirlo. En este ejemplo usamos el archivo MainPage.xaml.cs.
  2. Usa el siguiente código para registrar los botones que alternan entre reproducir, pausar y detener de tu aplicación:
    
    MediaControl.PlayPauseTogglePressed += MediaControl_PlayPauseTogglePressed;
    MediaControl.PlayPressed += MediaControl_PlayPressed;
    MediaControl.PausePressed += MediaControl_PausePressed;
    MediaControl.StopPressed += MediaControl_StopPressed;
    
    
    
    
  3. Usa el siguiente código para controlar los eventos que se generan cuando se generan los eventos reproducir , pausar y detener:
    
    void MediaControl_StopPressed(object sender, object e)
    {
        // media is a MediaElement defined in XAML
        media.Stop();
    }
    
    void MediaControl_PausePressed(object sender, object e)
    {
        // media is a MediaElement defined in XAML
        media.Pause();
    }
    
    void MediaControl_PlayPressed(object sender, object e)
    {
        // media is a MediaElement defined in XAML
        media.Play();
    }
    
    void MediaControl_PlayPauseTogglePressed(object sender, object e)
    {
        if (MediaControl.IsPlaying == true)
        {
            // media is a MediaElement defined in XAML
            media.Pause();
        }
        else
        {
            // media is a MediaElement defined in XAML
            media.Play();
        }
    }
    
    
    

Observaciones

Nota  Si tienes una aplicación que realiza otras tareas además de transmitir audio y vídeo, entonces, cuando la aplicación pierda foco y ya no sea la ventana activa, debe dejar de realizar trabajos que no estén relacionados con elementos multimedia. La aplicación puede continuar transmitiendo audio y, en el caso de una secuencia de audio-vídeo, la transmisión de vídeo se detendrá automáticamente.

Ejemplo completo

Para obtener un ejemplo completo de cómo transmitir audio y vídeo, consulta la muestra de reproducción de multimedia XAML.

Temas relacionados

Cómo usar los controles de transporte multimedia del sistema
Muestra de SystemMediaTransportControls
Muestra de administrador de reproducción
Inicio rápido: vídeo y audio
Inicio rápido: crear una aplicación de reproductor multimedia
Reproducción de multimedia, de principio a fin

 

 

Mostrar:
© 2015 Microsoft