Compartir vía


Reproducir elementos multimedia en segundo plano

En este artículo se muestra cómo configurar la aplicación para que los medios continúen reproduciéndose cuando la aplicación pase del primer plano al fondo. Esto significa que incluso después de que el usuario haya minimizado la aplicación, haya vuelto a la pantalla principal o haya navegado fuera de la aplicación de alguna otra manera, la aplicación puede seguir reproduciendo audio.

Entre los escenarios para la reproducción de audio en segundo plano se incluyen:

  • Listas de reproducción de larga duración: el usuario abre brevemente una aplicación en primer plano para seleccionar e iniciar una lista de reproducción, después de la cual el usuario espera que la lista de reproducción continúe reproduciendo en segundo plano.

  • Uso del conmutador de tareas: el usuario abre brevemente una aplicación en primer plano para empezar a reproducir audio y, a continuación, cambia a otra aplicación abierta mediante el conmutador de tareas. El usuario espera que el audio continúe reproduciendo en segundo plano.

La implementación de audio en segundo plano descrita en este artículo permitirá que la aplicación se ejecute universalmente en todos los dispositivos Windows, incluidos Mobile, Desktop y Xbox.

Nota:

El código de este artículo se adaptó del ejemplo de audio en segundo plano de UWP.

Explicación del modelo de un solo proceso

Con Windows 10, versión 1607, se ha introducido un nuevo modelo de proceso único que simplifica considerablemente el proceso de habilitación del audio en segundo plano. Anteriormente, la aplicación era necesaria para administrar un proceso en segundo plano además de la aplicación en primer plano y, a continuación, comunicar manualmente los cambios de estado entre los dos procesos. En el nuevo modelo, simplemente agregas la funcionalidad de audio en segundo plano al manifiesto de la aplicación y la aplicación seguirá reproduciendo audio automáticamente cuando se mueva al fondo. Dos nuevos eventos de ciclo de vida de la aplicación, EnteredBackground y LeavingBackground permiten a la aplicación saber cuándo entra y sale del fondo. Cuando la aplicación se mueve a las transiciones hacia o desde el fondo, las restricciones de memoria que aplica el sistema pueden cambiar, por lo que puede usar estos eventos para comprobar el consumo de memoria actual y liberar recursos para mantenerse por debajo del límite.

Al eliminar la compleja comunicación entre procesos y la administración de estados, el nuevo modelo permite implementar audio en segundo plano mucho más rápidamente con una reducción significativa del código. Sin embargo, el modelo de dos procesos todavía se admite en la versión actual para la compatibilidad con versiones anteriores. Para obtener más información, consulte Modelo de audio en segundo plano heredado.

Requisitos para audio en segundo plano

La aplicación debe cumplir los siguientes requisitos para la reproducción de audio mientras la aplicación está en segundo plano.

  • Agregue la funcionalidad De reproducción multimedia en segundo plano al manifiesto de la aplicación, como se describe más adelante en este artículo.
  • Si la aplicación deshabilita la integración automática de MediaPlayer con los controles de transporte multimedia del sistema (SMTC), como estableciendo la propiedad CommandManager.IsEnabled en false, debes implementar la integración manual con el SMTC para habilitar la reproducción multimedia en segundo plano. También debes integrar manualmente con SMTC si estás usando una API distinta de MediaPlayer, como AudioGraph, para reproducir audio si quieres que el audio continúe reproduciendo cuando la aplicación se mueva al fondo. Los requisitos mínimos de integración smTC se describen en la sección "Usar los controles de transporte multimedia del sistema para audio en segundo plano" del control manual de los controles de transporte multimedia del sistema.
  • Mientras la aplicación está en segundo plano, debes mantenerte bajo los límites de uso de memoria establecidos por el sistema para las aplicaciones en segundo plano. Más adelante en este artículo se proporcionan instrucciones para administrar la memoria en segundo plano.

Funcionalidad de manifiesto de reproducción multimedia en segundo plano

Para habilitar el audio en segundo plano, debe agregar la funcionalidad de reproducción multimedia en segundo plano al archivo de manifiesto de la aplicación, Package.appxmanifest.

Para agregar funcionalidades al manifiesto de aplicación mediante el diseñador de manifiestos

  1. En Microsoft Visual Studio, en el Explorador de soluciones, abra el diseñador para el manifiesto de aplicación haciendo doble clic en el elemento package.appxmanifest.
  2. Seleccione la pestaña Funcionalidades.
  3. Active la casilla Reproducción multimedia en segundo plano.

Para establecer la funcionalidad editando manualmente el xml del manifiesto de la aplicación, primero asegúrese de que el prefijo del espacio de nombres uap3 está definido en el elemento Package . Si no es así, agréguelo como se muestra a continuación.

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
  IgnorableNamespaces="uap uap3 mp">

A continuación, agregue la funcionalidad backgroundMediaPlayback al elemento Capabilities :

<Capabilities>
    <uap3:Capability Name="backgroundMediaPlayback"/>
</Capabilities>

Control de la transición entre primer plano y segundo plano

Cuando la aplicación se mueve del primer plano al fondo, se genera el evento EnteredBackground. Y cuando la aplicación vuelve al primer plano, se genera el evento LeavingBackground. Dado que se trata de eventos de ciclo de vida de la aplicación, debes registrar controladores para estos eventos cuando se crea la aplicación. En la plantilla de proyecto predeterminada, esto significa agregarla al constructor de clase App en App.xaml.cs.

public App()
{
    this.InitializeComponent();
    this.Suspending += OnSuspending;

    this.EnteredBackground += App_EnteredBackground;
    this.LeavingBackground += App_LeavingBackground;
}

Cree una variable para realizar un seguimiento de si se está ejecutando actualmente en segundo plano.

bool _isInBackgroundMode = false;

Cuando se genere el evento EnteredBackground , establezca la variable de seguimiento para indicar que se está ejecutando actualmente en segundo plano. No debe realizar tareas de larga duración en el evento EnteredBackground porque esto puede hacer que la transición al fondo parezca lenta para el usuario.

private void App_EnteredBackground(object sender, EnteredBackgroundEventArgs e)
{
    _isInBackgroundMode = true;
}

En el controlador de eventos LeavingBackground , debes establecer la variable de seguimiento para indicar que la aplicación ya no se está ejecutando en segundo plano.

private void App_LeavingBackground(object sender, LeavingBackgroundEventArgs e)
{
    _isInBackgroundMode = false;
}

Requisitos de administración de memoria

La parte más importante de controlar la transición entre primer plano y segundo plano es administrar la memoria que usa la aplicación. Dado que la ejecución en segundo plano reducirá los recursos de memoria que la aplicación puede conservar en el sistema, también debe registrarse para los eventos AppMemoryUsageIncreased y AppMemoryUsageLimitChanging. Cuando se generan estos eventos, debes comprobar el uso actual de la memoria de la aplicación y el límite actual y, a continuación, reducir el uso de memoria si es necesario. Para obtener información sobre cómo reducir el uso de memoria mientras se ejecuta en segundo plano, consulta Liberar memoria cuando la aplicación se mueve al fondo.

Disponibilidad de red para aplicaciones multimedia en segundo plano

Todos los orígenes multimedia compatibles con la red, aquellos que no se crean a partir de una secuencia o un archivo, mantendrán activa la conexión de red mientras recuperan contenido remoto y lo liberan cuando no lo sean. MediaStreamSource, en concreto, se basa en la aplicación para notificar correctamente el intervalo almacenado en búfer correcto a la plataforma mediante SetBufferedRange. Una vez que todo el contenido esté completamente almacenado en búfer, la red ya no se reservará en nombre de la aplicación.

Si necesita realizar llamadas de red que se producen en segundo plano cuando los medios no se descargan, deben encapsularse en una tarea adecuada, como MaintenanceTrigger o TimeTrigger. Para obtener más información, consulta Compatibilidad con la aplicación con tareas en segundo plano.