Selección de pistas

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());
);