Compartir vía


Reproducción de contenido multimedia heredado en segundo plano

En este artículo se describe el modelo heredado de dos procesos para agregar compatibilidad con audio en segundo plano a la aplicación para UWP. A partir de Windows 10, versión 1607, un modelo de proceso único para audio en segundo plano que es mucho más sencillo de implementar. Para obtener más información sobre las recomendaciones actuales para el audio en segundo plano, vea Reproducir contenido multimedia en segundo plano. Este artículo está diseñado para proporcionar compatibilidad con aplicaciones que ya se han desarrollado mediante el modelo heredado de dos procesos.

Nota:

A partir de Windows, versión 1703, BackgroundMediaPlayer está en desuso y es posible que no esté disponible en versiones futuras de Windows.

Arquitectura de audio en segundo plano

Una aplicación que realiza la reproducción en segundo plano consta de dos procesos. El primer proceso es la aplicación principal, que contiene la interfaz de usuario de la aplicación y la lógica de cliente, que se ejecuta en primer plano. El segundo proceso es la tarea de reproducción en segundo plano, que implementa IBackgroundTask como todas las tareas en segundo plano de la aplicación para UWP. La tarea en segundo plano contiene la lógica de reproducción de audio y los servicios en segundo plano. La tarea en segundo plano se comunica con el sistema a través de los controles de transporte multimedia del sistema.

En el diagrama siguiente se muestra información general sobre cómo se ha diseñado el sistema.

Arquitectura de audio en segundo plano de Windows 10

MediaPlayer

El espacio de nombres Windows.Media.Playback contiene las API que se usan para reproducir audio en segundo plano. Hay una sola instancia de MediaPlayer por aplicación a través de la cual se produce la reproducción. La aplicación de audio en segundo plano llama a métodos y establece propiedades en la clase MediaPlayer para establecer la pista actual, iniciar la reproducción, pausar, avanzar rápidamente, rebobinar, etc. Siempre se tiene acceso a la instancia del objeto del reproductor multimedia a través de la propiedad BackgroundMediaPlayer.Current.

Proxy y código auxiliar de MediaPlayer

Cuando se accede a BackgroundMediaPlayer.Current desde el proceso en segundo plano de la aplicación, la instancia de MediaPlayer se activa en el host de tareas en segundo plano y se puede manipular directamente.

Cuando se accede a BackgroundMediaPlayer.Current desde la aplicación en primer plano, la instancia de MediaPlayer que se devuelve es realmente un proxy que se comunica con un código auxiliar en el proceso en segundo plano. Este código auxiliar se comunica con la instancia real de MediaPlayer , que también se hospeda en el proceso en segundo plano.

Tanto el proceso en primer plano como en segundo plano pueden tener acceso a la mayoría de las propiedades de la instancia de MediaPlayer, a excepción de MediaPlayer.Source y MediaPlayer.SystemMediaTransportControls a las que solo se puede acceder desde el proceso en segundo plano. La aplicación en primer plano y el proceso en segundo plano pueden recibir notificaciones de eventos específicos de medios como MediaOpened, MediaEnded y MediaFailed.

Listas de reproducción

Un escenario común para las aplicaciones de audio en segundo plano es reproducir varios elementos en una fila. Esto se logra con mayor facilidad en el proceso en segundo plano mediante un objeto MediaPlaybackList, que se puede establecer como origen en MediaPlayer asignando a la propiedad MediaPlayer.Source.

No es posible acceder a mediaPlaybackList desde el proceso en primer plano que se estableció en el proceso en segundo plano.

Controles de transporte multimedia del sistema

Un usuario puede controlar la reproducción de audio sin usar directamente la interfaz de usuario de la aplicación a través de medios como dispositivos Bluetooth, SmartGlass y los controles de transporte multimedia del sistema. La tarea en segundo plano usa la clase SystemMediaTransportControls para suscribirse a estos eventos del sistema iniciados por el usuario.

Para obtener una instancia de SystemMediaTransportControls desde el proceso en segundo plano, use la propiedad MediaPlayer.SystemMediaTransportControls . Las aplicaciones en primer plano obtienen una instancia de la clase llamando a SystemMediaTransportControls.GetForCurrentView, pero la instancia devuelta es una instancia de solo primer plano que no está relacionada con la tarea en segundo plano.

Envío de mensajes entre tareas

Hay ocasiones en las que querrá comunicarse entre los dos procesos de una aplicación de audio en segundo plano. Por ejemplo, es posible que desee que la tarea en segundo plano notifique a la tarea en primer plano cuando una nueva pista comienza a reproducirse y, a continuación, envíe el nuevo título de la canción a la tarea en primer plano para mostrarla en la pantalla.

Un mecanismo de comunicación simple genera eventos en los procesos en primer plano y en segundo plano. Los métodos SendMessageToForeground y SendMessageToBackground invocan eventos en el proceso correspondiente. Los mensajes se pueden recibir mediante la suscripción a los eventos MessageReceivedFromBackground y MessageReceivedFromForeground.

Los datos se pueden pasar como argumentos a los métodos de envío de mensajes que, a continuación, se pasan a los controladores de eventos recibidos del mensaje. Pase datos mediante la clase ValueSet. Esta clase es un diccionario que contiene una cadena como clave y otros tipos de valor como valores. Puede pasar tipos de valor simples, como enteros, cadenas y booleanos.

Ciclo de vida de tareas en segundo plano

La duración de una tarea en segundo plano está estrechamente vinculada al estado de reproducción actual de la aplicación. Por ejemplo, cuando el usuario pausa la reproducción de audio, el sistema puede finalizar o cancelar la aplicación en función de las circunstancias. Después de un período de tiempo sin reproducción de audio, el sistema puede apagar automáticamente la tarea en segundo plano.

El método IBackgroundTask.Run se llama la primera vez que la aplicación accede a BackgroundMediaPlayer.Current desde el código que se ejecuta en la aplicación en primer plano o al registrar un controlador para el evento MessageReceivedFromBackground, lo que ocurra primero. Se recomienda registrar el controlador de mensajes recibidos antes de llamar a BackgroundMediaPlayer.Current por primera vez para que la aplicación en primer plano no pierda los mensajes enviados desde el proceso en segundo plano.

Para mantener activa la tarea en segundo plano, la aplicación debe solicitar un BackgroundTaskDeferral desde el método Run y llamar a BackgroundTaskDeferral.Complete cuando la instancia de tarea reciba los eventos Canceled o Completed. No loop ni espere en el método Run porque consume recursos y puede hacer que el sistema finalice la tarea en segundo plano de la aplicación.

La tarea en segundo plano obtiene el evento Completed cuando se completa el método Run y no se solicita el aplazamiento. En algunos casos, cuando la aplicación obtiene el evento Canceled , también puede ir seguido del evento Completed . La tarea puede recibir un evento Cancelado mientras se ejecuta Run , por lo que asegúrese de administrar esta posible simultaneidad.

Entre las situaciones en las que se puede cancelar la tarea en segundo plano se incluyen:

  • Se inicia una nueva aplicación con funcionalidades de reproducción de audio en sistemas que aplican la sub-directiva de exclusividad. Consulte la sección Directivas del sistema para la duración de tareas de audio en segundo plano a continuación.

  • Se ha iniciado una tarea en segundo plano, pero la música aún no se está reproduciendo y, a continuación, se suspende la aplicación en primer plano.

  • Otras interrupciones multimedia, como las llamadas telefónicas entrantes o las llamadas VoIP.

Entre las situaciones en las que se puede finalizar la tarea en segundo plano sin previo aviso se incluyen:

  • Se incluye una llamada VoIP y no hay suficiente memoria disponible en el sistema para mantener activa la tarea en segundo plano.

  • Se infringe una directiva de recursos.

  • La cancelación o finalización de tareas no finaliza correctamente.

Directivas del sistema para la duración de la tarea de audio en segundo plano

Las siguientes directivas ayudan a determinar cómo administra el sistema la duración de las tareas de audio en segundo plano.

Exclusividad

Si está habilitada, esta subconsulta limita el número de tareas de audio en segundo plano como máximo 1 en un momento dado. Está habilitado en mobile y otras SKU que no son de escritorio.

Tiempo de espera de inactividad

Debido a las restricciones de recursos, el sistema puede finalizar la tarea en segundo plano después de un período de inactividad.

Una tarea en segundo plano se considera "inactiva" si se cumplen las dos condiciones siguientes:

  • La aplicación en primer plano no está visible (se suspende o finaliza).

  • El reproductor multimedia en segundo plano no está en estado de reproducción.

Si se cumplen ambas condiciones, la directiva del sistema multimedia en segundo plano iniciará un temporizador. Si ninguna condición ha cambiado cuando expire el temporizador, la directiva del sistema multimedia en segundo plano finalizará la tarea en segundo plano.

Duración compartida

Si está habilitada, esta sub-directiva obliga a que la tarea en segundo plano dependa de la duración de la tarea en primer plano. Si el usuario o el sistema apagan la tarea en primer plano, la tarea en segundo plano también se apagará.

Sin embargo, tenga en cuenta que esto no significa que el primer plano depende del fondo. Si se cierra la tarea en segundo plano, esto no obliga a que se cierre la tarea en primer plano.

En la tabla siguiente se enumeran las directivas que se aplican en qué tipos de dispositivo.

Subconsulta Escritorio Móvil Otros
Exclusividad Deshabilitado habilitado habilitado
Tiempo de espera de inactividad Deshabilitado habilitado Disabled
Duración compartida habilitado Disabled Disabled