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). SMTC es un conjunto de controles que son comunes a todos los dispositivos Windows 10 y que proporcionan una manera coherente de que los usuarios controle la reproducción multimedia para todas las aplicaciones en ejecución que usan MediaPlayer para la reproducción.
Los controles de transporte multimedia del sistema permiten que los desarrolladores de aplicaciones multimedia se integren 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.
Para obtener un ejemplo completo que muestre la integración con SMTC, consulte Ejemplo de controles de transporte multimedia del sistema en github.
Integración automática con SMTC
A partir de Windows 10, versión 1607, las aplicaciones para UWP que usan la clase MediaPlayer para reproducir elementos multimedia se integran automáticamente con SMTC de forma predeterminada. Simplemente cree una instancia nueva de MediaPlayer y asigne un objeto MediaSource, MediaPlaybackItem o MediaPlaybackList a la propiedad Source del reproductor y el usuario verá el nombre de la aplicación en smTC y podrá reproducir, pausar y desplazarse por las listas de reproducción mediante los controles SMTC.
La aplicación puede crear y usar varios objetos MediaPlayer a la vez. Para cada instancia activa de MediaPlayer en la aplicación, se crea una pestaña independiente en SMTC, lo que permite al usuario cambiar entre los reproductores multimedia activos y los de otras aplicaciones en ejecución. El reproductor multimedia que esté seleccionado actualmente en smTC es el que afectarán los controles.
Para obtener más información sobre el uso de MediaPlayer en tu aplicación, incluido enlazarlo a mediaPlayerElement en tu página XAML, consulta Reproducir audio y vídeo con MediaPlayer.
Para obtener más información sobre cómo trabajar con MediaSource, MediaPlaybackItem y MediaPlaybackList, consulta Elementos multimedia, listas de reproducción y pistas.
Agregar metadatos para que los SMTC muestren
Si desea agregar o modificar los metadatos que se muestran para los elementos multimedia en smTC, como un título de vídeo o canción, debe actualizar las propiedades de visualización del objeto MediaPlaybackItem que representa el elemento multimedia. En primer lugar, obtenga una referencia al objeto MediaItemDisplayProperties llamando a GetDisplayProperties. A continuación, establezca el tipo de medios, música o vídeo para el elemento con la propiedad Type. A continuación, puede rellenar los campos de MusicProperties o VideoProperties, en función del tipo de medio especificado. Por último, actualice los metadatos del elemento multimedia llamando 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 el contenido multimedia correctamente, incluida la prevención de que el protector de pantalla se active durante la reproducción.
Usar CommandManager para modificar o invalidar los comandos 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 accediendo a la propiedad CommandManager.
Para cada comando, como el comando Next que, de forma predeterminada, se omite al siguiente elemento de un objeto MediaPlaybackList, el administrador de comandos expone un evento recibido, como NextReceived, y un objeto que administra el comportamiento del comando, como NextBehavior.
En el ejemplo siguiente se registra un controlador para el evento NextReceived y para el evento IsEnabledChanged del NextBehavior.
_mediaPlayer.CommandManager.NextReceived += CommandManager_NextReceived;
_mediaPlayer.CommandManager.NextBehavior.IsEnabledChanged += NextBehavior_IsEnabledChanged;
En el ejemplo siguiente se muestra un escenario en el que la aplicación quiere deshabilitar el comando Next después de que el usuario haya hecho clic en cinco elementos de la lista de reproducción, quizás requiera alguna interacción del usuario antes de continuar reproduciendo contenido. Cada ## se genera el evento NextReceived , se incrementa un contador. Una vez que el contador alcanza el número de destino, el comando EnablingRule para el comando Next se establece en Nunca, lo que 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 puede establecer el comando en Always, lo que significa que el comando siempre se habilitará aunque, en el ejemplo de comando Siguiente , no haya más elementos en la lista de reproducción. O bien, puede establecer el comando en Automático, donde el sistema determina si el comando debe habilitarse en función del contenido actual que se está reproducndo.
En el escenario descrito anteriormente, en algún momento la aplicación querrá volver a habilitar el comando Next y lo hace estableciendo en HabilitarRule en Automático.
_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 para que coincida con el SMTC, ya que los comandos están habilitados o deshabilitados accediendo al IsEnabled del MediaPlaybackCommandManagerCommandBehavior pasado al controlador.
private void NextBehavior_IsEnabledChanged(MediaPlaybackCommandManagerCommandBehavior sender, object args)
{
MyNextButton.IsEnabled = sender.IsEnabled;
}
En algunos casos, es posible que desee invalidar completamente el comportamiento de un comando SMTC. En el ejemplo siguiente se muestra un escenario en el que una aplicación usa los comandos Next y Previous para cambiar entre estaciones de radio de Internet en lugar de omitir entre pistas de la lista de reproducción actual. Como en el ejemplo anterior, se registra un controlador para cuando se recibe un comando, en este caso es el evento PreviousReceived.
_mediaPlayer.CommandManager.PreviousReceived += CommandManager_PreviousReceived;
En el controlador PreviousReceived, primero se obtiene un aplazamiento llamando al getDeferral de 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 va a realizar llamadas asincrónicas en el controlador. En este punto, el ejemplo llama a un método personalizado que devuelve un objeto MediaPlaybackItem que representa la estación de radio anterior.
A continuación, se comprueba la propiedad Handled para asegurarse de que otro controlador no controló el evento. Si no es así, la propiedad Handled se establece en true. Esto permite que SMTC y cualquier otro controlador suscrito sepan que no deben realizar ninguna acción para ejecutar este comando porque ya se ha controlado. 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 informar al sistema de que ha terminado 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 del SMTC
Como se mencionó anteriormente en este artículo, SMTC detectará y mostrará automáticamente la información de cada instancia de MediaPlayer que cree la aplicación. Si quieres usar varias instancias de MediaPlayer pero quieres que SMTC proporcione una sola entrada para tu aplicación, debes controlar manualmente el comportamiento de SMTC en lugar de confiar en la integración automática. Además, si usa MediaTimelineController para controlar uno o varios reproductores multimedia, debe usar la integración manual de SMTC. Además, si la aplicación usa una API distinta de MediaPlayer, como la clase AudioGraph, para reproducir contenido multimedia, debes implementar la integración manual de SMTC para que el usuario use SMTC para controlar la aplicación. Para obtener información sobre cómo controlar manualmente el SMTC, vea Control manual de los controles de transporte multimedia del sistema.
Temas relacionados
- Reproducción de multimedia
- Reproducir audio y vídeo con MediaPlayer
- Control manual de los controles de transporte de contenido multimedia del sistema
- Ejemplo de controles de transporte multimedia del sistema en github