Control manual de los controles de transporte de contenido multimedia del sistema
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 los controles de transporte multimedia del sistema (SMTC) de forma predeterminada. Esta es la forma recomendada de interactuar con el SMTC para la mayoría de los escenarios. Para obtener más información sobre cómo personalizar la integración predeterminada de SMTC con MediaPlayer, vea Integrar con los controles de transporte multimedia del sistema.
Hay algunos escenarios en los que es posible que tenga que implementar el control manual del SMTC. Estos incluyen si usa un mediaTimelineController para controlar la reproducción de uno o varios reproductores multimedia. O bien, si usa varios reproductores multimedia y solo quiere tener una instancia de SMTC para la aplicación. Debe controlar manualmente el SMTC si usa MediaElement para reproducir elementos multimedia.
Configurar controles de transporte
Si usas MediaPlayer para reproducir contenido multimedia, puedes obtener una instancia de la clase SystemMediaTransportControls accediendo a la propiedad MediaPlayer.SystemMediaTransportControls. Si vas a controlar manualmente el SMTC, debes deshabilitar la integración automática proporcionada por MediaPlayer estableciendo la propiedad CommandManager.IsEnabled en false.
Nota:
Si deshabilitas el MediaPlaybackCommandManager de MediaPlayer estableciendo IsEnabled en false, interrumpirá el vínculo entre mediaPlayer los TransportControls proporcionados por MediaPlayerElement, por lo que los controles de transporte integrados ya no controlarán automáticamente la reproducción del reproductor. En su lugar, debes implementar tus propios controles para controlar mediaPlayer.
_mediaPlayer = new MediaPlayer();
_systemMediaTransportControls = _mediaPlayer.SystemMediaTransportControls;
_mediaPlayer.CommandManager.IsEnabled = false;
También puede obtener una instancia de SystemMediaTransportControls llamando a GetForCurrentView. Debe obtener el objeto con este método si usa MediaElement para reproducir elementos multimedia.
_systemMediaTransportControls = SystemMediaTransportControls.GetForCurrentView();
Habilite los botones que usará la aplicación estableciendo la propiedad "is enabled" correspondiente del objeto SystemMediaTransportControls, como IsPlayEnabled, IsPauseEnabled, IsNextEnabled e IsPreviousEnabled. Consulte la documentación de referencia de SystemMediaTransportControls para obtener una lista completa de los controles disponibles.
_systemMediaTransportControls.IsPlayEnabled = true;
_systemMediaTransportControls.IsPauseEnabled = true;
Registra un controlador para el evento ButtonPressed para recibir notificaciones cuando el usuario presiona un botón.
_systemMediaTransportControls.ButtonPressed += SystemControls_ButtonPressed;
Controlar los controles de transporte multimedia del sistema presiona los botones
El evento ButtonPressed se genera mediante los controles de transporte del sistema cuando se presiona uno de los botones habilitados. La propiedad Button de SystemMediaTransportControlsButtonPressedEventArgs que se pasa al controlador de eventos es un miembro de la enumeración SystemMediaTransportControlsButton que indica cuál de los botones habilitados se ha presionado.
Para actualizar objetos en el subproceso de interfaz de usuario desde el controlador de eventos ButtonPressed, como un objeto MediaElement, debe serializar las llamadas a través de CoreDispatcher. Esto se debe a que no se llama al controlador de eventos ButtonPressed desde el subproceso de la interfaz de usuario y, por tanto, se producirá una excepción si intenta modificar la interfaz de usuario directamente.
async void SystemControls_ButtonPressed(SystemMediaTransportControls sender,
SystemMediaTransportControlsButtonPressedEventArgs args)
{
switch (args.Button)
{
case SystemMediaTransportControlsButton.Play:
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
mediaElement.Play();
});
break;
case SystemMediaTransportControlsButton.Pause:
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
mediaElement.Pause();
});
break;
default:
break;
}
}
Actualizar los controles de transporte multimedia del sistema con el estado actual de los medios
Debe notificar a SystemMediaTransportControls cuando el estado del medio haya cambiado para que el sistema pueda actualizar los controles para reflejar el estado actual. Para ello, establezca la propiedad PlaybackStatus en el valor MediaPlaybackStatus adecuado desde dentro del evento CurrentStateChanged de MediaElement, que se genera cuando cambia el estado multimedia.
void MediaElement_CurrentStateChanged(object sender, RoutedEventArgs e)
{
switch (mediaElement.CurrentState)
{
case MediaElementState.Playing:
_systemMediaTransportControls.PlaybackStatus = MediaPlaybackStatus.Playing;
break;
case MediaElementState.Paused:
_systemMediaTransportControls.PlaybackStatus = MediaPlaybackStatus.Paused;
break;
case MediaElementState.Stopped:
_systemMediaTransportControls.PlaybackStatus = MediaPlaybackStatus.Stopped;
break;
case MediaElementState.Closed:
_systemMediaTransportControls.PlaybackStatus = MediaPlaybackStatus.Closed;
break;
default:
break;
}
}
Actualización de los controles de transporte multimedia del sistema con información multimedia y miniaturas
Use la clase SystemMediaTransportControlsDisplayUpdater para actualizar la información multimedia que muestran los controles de transporte, como el título de la canción o la arte del álbum para el elemento multimedia que se está reproduciendo actualmente. Obtenga una instancia de esta clase con la propiedad SystemMediaTransportControls.DisplayUpdater. En escenarios típicos, la manera recomendada de pasar los metadatos es llamar a CopyFromFileAsync, pasando el archivo multimedia que se está reproduciendo actualmente. El actualizador de pantalla extraerá automáticamente los metadatos y la imagen en miniatura del archivo.
Llame a la actualización para hacer que los controles de transporte multimedia del sistema actualicen su interfaz de usuario con los nuevos metadatos y miniaturas.
async void MediaElement_MediaOpened(object sender, RoutedEventArgs e)
{
// Get the updater.
SystemMediaTransportControlsDisplayUpdater updater = _systemMediaTransportControls.DisplayUpdater;
await updater.CopyFromFileAsync(MediaPlaybackType.Music, currentMediaFile);
// Update the system media transport controls
updater.Update();
}
Si su escenario lo requiere, puede actualizar los metadatos mostrados por los controles de transporte multimedia del sistema manualmente estableciendo los valores de los objetos MusicProperties, ImageProperties o VideoProperties expuestos por la clase DisplayUpdater.
// Get the updater.
SystemMediaTransportControlsDisplayUpdater updater = _systemMediaTransportControls.DisplayUpdater;
// Music metadata.
updater.Type = MediaPlaybackType.Music;
updater.MusicProperties.Artist = "artist";
updater.MusicProperties.AlbumArtist = "album artist";
updater.MusicProperties.Title = "song title";
// Set the album art thumbnail.
// RandomAccessStreamReference is defined in Windows.Storage.Streams
updater.Thumbnail =
RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Music/music1_AlbumArt.jpg"));
// Update the system media transport controls.
updater.Update();
Nota:
Las aplicaciones deben establecer un valor para la propiedad SystemMediaTransportControlsDisplayUpdater.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.
Actualizar las propiedades de escala de tiempo de los controles de transporte multimedia del sistema
Los controles de transporte del sistema muestran información sobre la escala de tiempo del elemento multimedia que se está reproduciendo actualmente, incluida la posición de reproducción actual, la hora de inicio y la hora de finalización del elemento multimedia. Para actualizar las propiedades de escala de tiempo de los controles de transporte del sistema, cree un nuevo objeto SystemMediaTransportControlsTimelineProperties. Establezca las propiedades del objeto para reflejar el estado actual del elemento multimedia de reproducción. Llame a SystemMediaTransportControls.UpdateTimelineProperties para hacer que los controles actualicen la escala de tiempo.
// Create our timeline properties object
var timelineProperties = new SystemMediaTransportControlsTimelineProperties();
// Fill in the data, using the media elements properties
timelineProperties.StartTime = TimeSpan.FromSeconds(0);
timelineProperties.MinSeekTime = TimeSpan.FromSeconds(0);
timelineProperties.Position = mediaElement.Position;
timelineProperties.MaxSeekTime = mediaElement.NaturalDuration.TimeSpan;
timelineProperties.EndTime = mediaElement.NaturalDuration.TimeSpan;
// Update the System Media transport Controls
_systemMediaTransportControls.UpdateTimelineProperties(timelineProperties);
Debe proporcionar un valor para StartTime, EndTime y Position para que los controles del sistema muestren una escala de tiempo para el elemento de reproducción.
MinSeekTime y MaxSeekTime permiten especificar el intervalo dentro de la escala de tiempo que el usuario puede buscar. Un escenario típico para esto es permitir que los proveedores de contenido incluyan interrupciones de anuncios en sus medios.
Debe establecer MinSeekTime y MaxSeekTime para que se genere PositionChangeRequest.
Se recomienda mantener los controles del sistema sincronizados con la reproducción multimedia actualizando estas propiedades aproximadamente cada 5 segundos durante la reproducción y de nuevo cada vez que cambia el estado de reproducción, como pausar o buscar una nueva posición.
Responder a los cambios de propiedad del reproductor
Hay un conjunto de propiedades de controles de transporte del sistema relacionadas con el estado actual del propio reproductor multimedia, en lugar del estado del elemento multimedia de reproducción. Cada una de estas propiedades coincide con un evento que se genera cuando el usuario ajusta el control asociado. Estas propiedades y eventos incluyen:
Propiedad | Evento |
---|---|
AutoRepeatMode | AutoRepeatModeChangeRequested |
PlaybackRate | PlaybackRateChangeRequested |
ShuffleEnabled | ShuffleEnabledChangeRequested |
Para controlar la interacción del usuario con uno de estos controles, primero registre un controlador para el evento asociado.
_systemMediaTransportControls.PlaybackRateChangeRequested += SystemControls_PlaybackRateChangeRequested;
En el controlador del evento, primero asegúrese de que el valor solicitado está dentro de un intervalo válido y esperado. Si es así, establezca la propiedad correspondiente en MediaElement y, a continuación, establezca la propiedad correspondiente en el objeto SystemMediaTransportControls.
void SystemControls_PlaybackRateChangeRequested(SystemMediaTransportControls sender, PlaybackRateChangeRequestedEventArgs args)
{
// Check the requested value to make sure it is within a valid and expected range
if (args.RequestedPlaybackRate >= 0 && args.RequestedPlaybackRate <= 2)
{
// Set the requested value on the MediaElement
mediaElement.PlaybackRate = args.RequestedPlaybackRate;
// Update the system media controls to reflect the new value
_systemMediaTransportControls.PlaybackRate = mediaElement.PlaybackRate;
}
}
- Para que se genere uno de estos eventos de propiedad del reproductor, debe establecer un valor inicial para la propiedad . Por ejemplo, PlaybackRateChangeRequested no se generará hasta después de establecer un valor para la propiedad PlaybackRate al menos una vez.
Usar los controles de transporte multimedia del sistema para el audio en segundo plano
Si no usas la integración automática de SMTC proporcionada por MediaPlayer , debes integrar manualmente con SMTC para habilitar el audio en segundo plano. Como mínimo, la aplicación debe habilitar los botones reproducir y pausar estableciendo IsPlayEnabled e IsPauseEnabled en true. La aplicación también debe controlar el evento ButtonPressed. Si la aplicación no cumple estos requisitos, la reproducción de audio se detendrá cuando la aplicación se mueva al fondo.
Las aplicaciones que usan el nuevo modelo de un proceso para audio en segundo plano deben obtener una instancia de SystemMediaTransportControls mediante una llamada a GetForCurrentView. Las aplicaciones que usan el modelo heredado de dos procesos para audio en segundo plano deben usar BackgroundMediaPlayer.Current.SystemMediaTransportControls para obtener acceso al SMTC desde su proceso en segundo plano.
Para obtener más información sobre cómo reproducir audio en segundo plano, vea Reproducir contenido multimedia en segundo plano.
Temas relacionados
- Reproducción de multimedia
- Integración con los controles de transporte multimedia del sistema
- Ejemplo de transporte multimedia del sistema