Integrar con los controles de transporte de contenido multimedia del sistema

En este artículo se muestra cómo interactuar con los controles de transporte multimedia del sistema (SMTC). Los SMTC son un conjunto de controles comunes para todos los dispositivos de Windows 10 que proporcionan un modo coherente para que los usuarios controlen la reproducción multimedia de todas las aplicaciones en ejecución que usan MediaPlayer para la reproducción.

Los controles de transporte multimedia del sistema permiten a los desarrolladores de aplicaciones multimedia integrarse con la interfaz de usuario del sistema integrada para mostrar metadatos multimedia como el artista, el título del álbum o el título del capítulo. El control de transporte del sistema también permite a un usuario controlar la reproducción de una aplicación multimedia mediante la interfaz de usuario del sistema integrada, como pausar la reproducción y omitir hacia delante y hacia atrás en una lista de reproducción.

Controles de transport de medios del sistema

Para obtener una muestra completa que demuestre la integración con los SMTC, consulta la muestra de controles de transporte multimedia del sistema en GitHub.

Integración automática con los SMTC

A partir de Windows 10, versión 1607, las aplicaciones para UWP que usan la clase MediaPlayer para reproducir contenido multimedia se integran automáticamente con los SMTC de manera predeterminada. Solo tienes que crear una nueva instancia de MediaPlayer y asignar un objeto MediaSource, MediaPlaybackItem o MediaPlaybackList a la propiedad Source del reproductor. El usuario verá el nombre de tu aplicación en los SMTC y podrá reproducir, pausar y recorrer tus listas de reproducción mediante los controles SMTC.

La aplicación puede crear y usar varios objetos MediaPlayer a la vez. Para cada instancia de MediaPlayer activa en la aplicación, se crea una pestaña independiente en los SMTC que permite al usuario cambiar entre los reproductores multimedia activos y los de otras aplicaciones en ejecución. El reproductor multimedia seleccionado actualmente en los SMTC es el que se verá afectado por los controles.

Para obtener más información sobre el uso de MediaPlayer en tu aplicación, como el enlace a un objeto MediaPlayerElement en la página XAML, consulta Reproducir audio y vídeo con MediaPlayer.

Para obtener más información sobre el uso de MediaSource, MediaPlaybackItem y MediaPlaybackList, consulta Elementos multimedia, listas de reproducción y pistas.

Agregar los metadatos que deben mostrar los SMTC

Si quieres agregar o modificar los metadatos que se muestran para los elementos multimedia en los SMTC, como el título de un vídeo o una canción, deberás actualizar las propiedades de visualización del objeto MediaPlaybackItem que representa el elemento multimedia. Primero, obtén una referencia al objeto MediaItemDisplayProperties llamando a GetDisplayProperties. Después, establece el tipo de contenido multimedia, música o vídeo, del elemento con la propiedad Type. A continuación, puedes rellenar los campos de MusicProperties o VideoProperties, según el tipo de contenido multimedia especificado. Por último, actualiza los metadatos del elemento multimedia mediante una llamada a ApplyDisplayProperties.

MediaItemDisplayProperties props = mediaPlaybackItem.GetDisplayProperties();
props.Type = Windows.Media.MediaPlaybackType.Video;
props.VideoProperties.Title = "Video title";
props.VideoProperties.Subtitle = "Video subtitle";
props.VideoProperties.Genres.Add("Documentary");
mediaPlaybackItem.ApplyDisplayProperties(props);
props = mediaPlaybackItem.GetDisplayProperties();
props.Type = Windows.Media.MediaPlaybackType.Music;
props.MusicProperties.Title = "Song title";
props.MusicProperties.Artist = "Song artist";
props.MusicProperties.Genres.Add("Polka");
mediaPlaybackItem.ApplyDisplayProperties(props);

Nota:

Las aplicaciones deben establecer un valor para la propiedad Type aunque no proporcionen otros metadatos multimedia que los controles de transporte multimedia del sistema muestren. Este valor ayuda al sistema a controlar correctamente el contenido multimedia, incluida la prevención de que el protector de pantalla se active durante la reproducción.

Usar CommandManager para modificar o invalidar los comandos de SMTC predeterminados

La aplicación puede modificar o invalidar completamente el comportamiento de los controles SMTC con la clase MediaPlaybackCommandManager. Se puede obtener una instancia del administrador de comandos para cada instancia de la clase MediaPlayer mediante el acceso a la propiedad CommandManager.

Para cada comando, como el comando Next (que salta al siguiente elemento de forma predeterminada en un objeto MediaPlaybackList), el administrador de comandos expone un evento recibido, como NextReceived y un objeto que administra el comportamiento del comando, como NextBehavior.

El siguiente ejemplo registra un controlador para el evento NextReceived y para el evento IsEnabledChanged de NextBehavior.

_mediaPlayer.CommandManager.NextReceived += CommandManager_NextReceived;
_mediaPlayer.CommandManager.NextBehavior.IsEnabledChanged += NextBehavior_IsEnabledChanged;

En el ejemplo siguiente se ilustra un escenario en que la aplicación quiere deshabilitar el comando Next cuando el usuario haya hecho clic en cinco elementos de la lista de reproducción y quizás exigir alguna interacción del usuario antes de seguir reproduciendo contenido. Cada ## que se genera el evento NextReceived, se incrementa un contador. Cuando el contador alcanza el número de destino, EnablingRule del comando Next se establece en Never, con lo que se deshabilita el comando.

int _nextPressCount = 0;
private void CommandManager_NextReceived(MediaPlaybackCommandManager sender, MediaPlaybackCommandManagerNextReceivedEventArgs args)
{
    _nextPressCount++;
    if (_nextPressCount > 5)
    {
        sender.NextBehavior.EnablingRule = MediaCommandEnablingRule.Never;
        // Perform app tasks while the Next button is disabled
    }
}

También puedes establecer el comando en Always para que siempre esté habilitado, incluso si, para el ejemplo del comando Next, no hay más elementos en la lista de reproducción. También puedes establecer el comando en Auto para que el sistema determine si el comando debe habilitarse en función del contenido que se reproduce.

Para el escenario descrito anteriormente, la aplicación querrá, en algún momento, volver a habilitar el comando Next. Para hacerlo, deberá establecer EnablingRule en Auto.

_mediaPlayer.CommandManager.NextBehavior.EnablingRule = MediaCommandEnablingRule.Auto;
_nextPressCount = 0;

Dado que la aplicación puede tener su propia interfaz de usuario para controlar la reproducción mientras está en primer plano, puedes usar los eventos IsEnabledChanged para actualizar tu propia interfaz de usuario de modo que coincida con los SMTC a medida que se habilitan o deshabilitan los comandos mediante el acceso a IsEnabled de la clase MediaPlaybackCommandManagerCommandBehavior pasada al controlador.

private void NextBehavior_IsEnabledChanged(MediaPlaybackCommandManagerCommandBehavior sender, object args)
{
    MyNextButton.IsEnabled = sender.IsEnabled;
}

En algunos casos, es posible que quieras invalidar completamente el comportamiento de un comando de SMTC. En el siguiente ejemplo, se muestra un escenario donde una aplicación usa los comandos Next y Previous para cambiar entre las emisoras de radio por Internet, en lugar de saltar entre las pistas de la lista de reproducción actual. Al igual que en el ejemplo anterior, se registra un controlador cuando se recibe un comando, que en este caso es el evento PreviousReceived.

_mediaPlayer.CommandManager.PreviousReceived += CommandManager_PreviousReceived;

En el controlador PreviousReceived , primero se obtiene un aplazamiento llamando al getDeferral del objeto MediaPlaybackCommandManagerPreviousReceivedEventArgs pasado al controlador. Esto indica al sistema que espere hasta que se complete el aplazamiento antes de ejecutar el comando. Esto es muy importante si vas a hacer llamadas asincrónicas en el controlador. En este punto, el ejemplo llama a un método personalizado que devuelve una clase MediaPlaybackItem que representa la emisora de radio anterior.

A continuación, se comprueba la propiedad Handled para garantizar que no había otro controlador que ya estaba controlando el evento. Si no es así, la propiedad Handled se establece en true. De este modo, los SMTC y cualquier otro controlador suscrito sabrán que no deben realizar ninguna acción para ejecutar este comando porque ya se controla. A continuación, el código establece el nuevo origen del reproductor multimedia e inicia el reproductor.

Por último, se llama a Complete en el objeto de aplazamiento para que el sistema sepa que terminaste de procesar el comando.

private async void CommandManager_PreviousReceived(MediaPlaybackCommandManager sender, MediaPlaybackCommandManagerPreviousReceivedEventArgs args)
{
    var deferral = args.GetDeferral();
    MediaPlaybackItem mediaPlaybackItem = await GetPreviousStation();

    if(args.Handled != true)
    {
        args.Handled = true;
        sender.MediaPlayer.Source = mediaPlaybackItem;
        sender.MediaPlayer.Play();
    }
    deferral.Complete();
}

Control manual de los SMTC

Como se mencionó anteriormente en este artículo, los SMTC detectarán y mostrarán automáticamente la información de todas las instancias de MediaPlayer que cree la aplicación. Si quieres usar varias instancias de MediaPlayer, pero quieres que los SMTC proporcionen una sola entrada para la aplicación, debes controlar manualmente el comportamiento de los SMTC en lugar de usar la integración automática. Además, si usas MediaTimelineController para controlar uno o más reproductores multimedia, debes usar la integración de SMTC manual. Asimismo, si la aplicación usa una API distinta de MediaPlayer, como la clase AudioGraph, para reproducir contenido multimedia, debes implementar la integración de SMTC manual para que el usuario emplee los SMTC para controlar la aplicación. Para obtener información sobre cómo controlar manualmente los SMTC, consulta Control manual de los controles de transporte de multimedia del sistema.