Cuando un elemento multimedia contiene varias pistas, la selección de pistas es el proceso que
determina cuáles de ellos se eligen para la reproducción. El proceso de selección de pistas es
configurado por TrackSelectionParameters
, lo que permite que muchas
Restricciones y anulaciones que influyen en la selección de pistas que se especificarán.
Consulta los segmentos disponibles
Puedes escuchar a Player.Listener.onTracksChanged
para recibir notificaciones sobre los cambios
a pistas, como las siguientes:
- Las pistas disponibles que se conocen cuando se prepara el elemento multimedia que se va a se completan los videos reproducidos. Ten en cuenta que el reproductor debe preparar un elemento multimedia para saber de las pistas que contiene.
- Las pistas disponibles cambian debido a la transición de la reproducción de un contenido multimedia un elemento a otro.
- Realiza cambios en los segmentos seleccionados.
Kotlin
player.addListener( object : Player.Listener { override fun onTracksChanged(tracks: Tracks) { // Update UI using current tracks. } } )
Java
player.addListener( new Player.Listener() { @Override public void onTracksChanged(Tracks tracks) { // Update UI using current tracks. } });
También puedes consultar los segmentos actuales llamando a player.getCurrentTracks()
.
El Tracks
que se muestra contiene una lista de objetos Track.Group
, en la que se hacen seguimientos dentro de un
La única Group
presenta el mismo contenido, pero en diferentes formatos.
Como ejemplo de cómo se pueden agrupar las pistas, considera una reproducción adaptable en la que se proporciona un feed de video principal con cinco tasas de bits y un feed de video alternativo (por ejemplo, un ángulo de cámara diferente en un partido deportivo) se proporciona en dos tasas de bits. En este caso, habrá dos grupos de pistas de video, uno correspondiente al grupo principal feed de video que contiene cinco pistas y otro para el feed de video alternativo que contiene dos pistas.
Pistas de audio cuyos idiomas difieren no se agrupan porque el contenido en idiomas diferentes no se considera lo mismo. Por el contrario, las pistas de audio en el mismo idioma que solo difieren en propiedades como la tasa de bits, el muestreo tarifa, recuento de canales, etc. Esto también se aplica a las pistas de texto.
Se puede consultar cada Group
para determinar qué segmentos se admiten
reproducción, que están seleccionadas actualmente, y qué Format
usa cada pista:
Kotlin
for (trackGroup in tracks.groups) { // Group level information. val trackType = trackGroup.type val trackInGroupIsSelected = trackGroup.isSelected val trackInGroupIsSupported = trackGroup.isSupported for (i in 0 until trackGroup.length) { // Individual track information. val isSupported = trackGroup.isTrackSupported(i) val isSelected = trackGroup.isTrackSelected(i) val trackFormat = trackGroup.getTrackFormat(i) } }
Java
for (Tracks.Group trackGroup : tracks.getGroups()) { // Group level information. @C.TrackType int trackType = trackGroup.getType(); boolean trackInGroupIsSelected = trackGroup.isSelected(); boolean trackInGroupIsSupported = trackGroup.isSupported(); for (int i = 0; i < trackGroup.length; i++) { // Individual track information. boolean isSupported = trackGroup.isTrackSupported(i); boolean isSelected = trackGroup.isTrackSelected(i); Format trackFormat = trackGroup.getTrackFormat(i); } }
- Un segmento es compatible si el
Player
puede decodificar y renderizar su de muestra. Ten en cuenta que incluso si hay varios grupos de seguimiento del mismo tipo (por ejemplo, varios grupos de pistas de audio), solo significa que solo sean compatibles individualmente y el reproductor no pueda reproducirlos necesariamente en al mismo tiempo. - Se selecciona una pista si se eligió para la reproducción según el estado
TrackSelectionParameters
Si hay varios segmentos dentro de un grupo de segmentos seleccionada, el reproductor usa esas pistas para la reproducción adaptativa (por ejemplo, múltiples pistas de video con distintas tasas de bits). Ten en cuenta que solo uno de estos pistas se reproducirán en cualquier momento.
Cómo modificar los parámetros de selección de pistas
El proceso de selección de pistas se puede configurar
Player.setTrackSelectionParameters
Puedes hacer esto antes y durante
reproducción. En el siguiente ejemplo, se muestra cómo obtener el valor
TrackSelectionParameters
desde el reproductor, modificarlos y actualizar Player
con el resultado modificado:
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build()
Java
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build());
Selección de pistas basada en restricciones
La mayoría de las opciones de TrackSelectionParameters
te permiten especificar restricciones.
que son independientes de los segmentos
que están disponibles en realidad. Disponibles
incluyen lo siguiente:
- El ancho, la altura, la velocidad de fotogramas y la tasa de bits máximos y mínimos del video
- Cantidad máxima de canales de audio y tasa de bits
- Tipos de MIME preferidos para audio y video.
- Idiomas de audio preferidos y marcas de función.
- Idiomas de texto preferidos y marcas de función.
ExoPlayer usa valores predeterminados sensibles para estas restricciones, por ejemplo, para restringir resolución del video al tamaño de la pantalla y prefiero el idioma del audio que Coincide con la configuración regional del sistema del usuario.
El uso de la selección de pistas basada en restricciones tiene varios beneficios en lugar de seleccionar pistas específicas entre las que están disponibles:
- Puedes especificar restricciones antes de saber qué seguimiento proporciona un elemento multimedia. Esto significa que las restricciones pueden especificarse antes de que el jugador prepare elemento multimedia, mientras que la selección de pistas específicas requiere que el código de la aplicación hasta que se conozcan los segmentos disponibles.
- Se aplican restricciones a todos los elementos multimedia de una playlist, incluso cuando
los artículos tienen diferentes segmentos disponibles. Por ejemplo, un idioma de audio preferido
se aplicará automáticamente a todos los elementos multimedia, incluso si
El
Format
de la pista en ese idioma varía de un elemento multimedia a otro. Este no es el caso cuando se seleccionan pistas específicas, como se describe a continuación.
Selección de pistas específicas
Puedes seleccionar segmentos específicos con TrackSelectionParameters
. Primero,
las pistas disponibles actualmente en el reproductor se deben consultar
Player.getCurrentTracks
Segundo, después de identificar qué pistas seleccionar,
se pueden configurar en TrackSelectionParameters
mediante un TrackSelectionOverride
.
Por ejemplo, para seleccionar la primera pista de un audioTrackGroup
específico, haz lo siguiente:
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setOverrideForType( TrackSelectionOverride(audioTrackGroup.mediaTrackGroup, /* trackIndex= */ 0) ) .build()
Java
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setOverrideForType( new TrackSelectionOverride( audioTrackGroup.getMediaTrackGroup(), /* trackIndex= */ 0)) .build());
Un TrackSelectionOverride
solo se aplicará a los elementos multimedia que contengan una
TrackGroup
coincide exactamente con el especificado en la anulación. Por lo tanto, un
es posible que no se aplique a un elemento multimedia posterior si ese elemento contiene
diferentes caminos.
Inhabilitación de tipos o grupos de segmentos
Los tipos de pistas, como video, audio o texto, se pueden inhabilitar por completo usando
TrackSelectionParameters.Builder.setTrackTypeDisabled
Un tipo de segmento inhabilitado
se inhabilitará para todos los elementos multimedia:
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true) .build()
Java
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true) .build());
Como alternativa, es posible evitar la selección de pistas de un
TrackGroup
especificando una anulación vacía para ese grupo:
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .addOverride( TrackSelectionOverride(disabledTrackGroup.mediaTrackGroup, /* trackIndices= */ listOf()) ) .build()
Java
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .addOverride( new TrackSelectionOverride( disabledTrackGroup.getMediaTrackGroup(), /* trackIndices= */ ImmutableList.of())) .build());
Cómo personalizar el selector de pistas
La selección de pistas es responsabilidad de un TrackSelector
, una instancia
de la cual se puede proporcionar cada vez que se compila un ExoPlayer
y, luego, se obtiene
con ExoPlayer.getTrackSelector()
.
Kotlin
val trackSelector = DefaultTrackSelector(context) val player = ExoPlayer.Builder(context).setTrackSelector(trackSelector).build()
Java
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context); ExoPlayer player = new ExoPlayer.Builder(context).setTrackSelector(trackSelector).build();
DefaultTrackSelector
es un TrackSelector
flexible compatible con la mayoría de los usos
diferentes. Usa el conjunto TrackSelectionParameters
en Player
, pero también
ofrece algunas opciones de personalización avanzadas que se pueden especificar en el
DefaultTrackSelector.ParametersBuilder
:
Kotlin
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true)) )
Java
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));
Uso de túneles
Puedes habilitar la reproducción en túnel en los casos en que la combinación de procesadores y
pistas seleccionadas lo admiten. Para hacerlo, usa
DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)
Descarga de audio
Puedes habilitar la reproducción de audio descargada en los casos en que la combinación de
y las pistas seleccionadas lo admiten. Para ello, especifica
AudioOffloadModePreferences
en tu TrackSelectionParameters
.
Kotlin
val audioOffloadPreferences = AudioOffloadPreferences.Builder() .setAudioOffloadMode(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED) // Add additional options as needed .setIsGaplessSupportRequired(true) .build() player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setAudioOffloadPreferences(audioOffloadPreferences) .build()
Java
AudioOffloadPreferences audioOffloadPreferences = new AudioOffloadPreferences.Builder() .setAudioOffloadMode(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED) // Add additional options as needed .setIsGaplessSupportRequired(true) .build(); player.setTrackSelectionParameters( player.getTrackSelectionParameters() .buildUpon() .setAudioOffloadPreferences(audioOffloadPreferences) .build()); );