Selezione traccia

Quando un elemento multimediale contiene più tracce, la selezione delle tracce è il processo che determina quali di esse vengono scelte per la riproduzione. Il processo di selezione delle tracce è configurato da TrackSelectionParameters, il che consente di specificare molti vincoli e override che influiscono sulla selezione delle tracce.

Esecuzione di query sulle tracce disponibili

Puoi ascoltare Player.Listener.onTracksChanged per ricevere notifiche sulle modifiche apportate alle tracce, tra cui:

  • Le tracce disponibili diventano note al termine della preparazione dell'elemento multimediale riprodotto. Tieni presente che il player deve preparare un elemento multimediale per sapere quali tracce contiene.
  • Le tracce disponibili cambiano a causa del passaggio della riproduzione da un elemento multimediale all'altro.
  • Modifiche alle tracce selezionate.

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.
      }
    });

Puoi anche eseguire query sulle tracce correnti chiamando player.getCurrentTracks(). Il valore Tracks restituito contiene un elenco di oggetti Track.Group, in cui le tracce all'interno di un singolo Group presentano gli stessi contenuti ma in formati diversi.

Per un esempio di raggruppamento delle tracce, considera una riproduzione adattiva in cui il feed video principale viene fornito con cinque velocità in bit e un feed video alternativo (ad esempio un angolo di ripresa diverso in una partita di calcio) viene fornito con due velocità in bit. In questo caso ci saranno due gruppi di tracce video, uno corrispondente al feed video principale contenente cinque tracce e un secondo per il feed video alternativo contenente due tracce.

Tracce audio le cui lingue diverse non sono raggruppate, perché i contenuti in lingue diverse non sono considerati uguali. Viceversa, le tracce audio nella stessa lingua, che differiscono solo per proprietà come velocità in bit, frequenza di campionamento, numero di canali e così via, possono essere raggruppate. Questo vale anche per le tracce di testo.

È possibile eseguire query su ogni Group per determinare quali tracce sono supportate per la riproduzione, quali sono attualmente selezionate e quali Format utilizza ogni traccia:

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

  • Una traccia è supportata se Player è in grado di decodificare e visualizzare i propri esempi. Tieni presente che anche se sono supportati più gruppi di tracce dello stesso tipo (ad esempio, più gruppi di tracce audio), significa solo che vengono supportati singolarmente e il player non è necessariamente in grado di riprodurli contemporaneamente.
  • Una traccia viene selezionata se è stata scelta per la riproduzione in base all'attuale TrackSelectionParameters. Se vengono selezionate più tracce in un gruppo di tracce, il player le utilizza per la riproduzione adattiva (ad esempio, più tracce video con velocità in bit diverse). Tieni presente che verrà riprodotta una sola di queste tracce alla volta.

Modifica dei parametri per la selezione dei canali

Il processo di selezione delle tracce può essere configurato utilizzando Player.setTrackSelectionParameters. Puoi farlo sia prima che durante la riproduzione. L'esempio seguente mostra come ottenere l'attuale TrackSelectionParameters dal player, modificarli e aggiornare Player con il risultato modificato:

Kotlin

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .setMaxVideoSizeSd()
    .setPreferredAudioLanguage("hu")
    .build()

Java

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .setMaxVideoSizeSd()
        .setPreferredAudioLanguage("hu")
        .build());

Selezione delle tracce basata su vincolo

La maggior parte delle opzioni in TrackSelectionParameters consente di specificare vincoli, che sono indipendenti dai canali effettivamente disponibili. I vincoli disponibili includono:

  • Larghezza, altezza, frequenza fotogrammi massima e minima del video e velocità in bit.
  • Numero massimo di canali audio e velocità in bit.
  • Tipi MIME preferiti per video e audio.
  • Lingue dell'audio preferite e flag dei ruoli.
  • Lingue di testo e flag dei ruoli preferiti.

ExoPlayer utilizza valori predefiniti appropriati per questi vincoli, ad esempio limitando la risoluzione dei video alle dimensioni di visualizzazione e preferendo la lingua audio che corrisponde all'impostazione internazionale del sistema dell'utente.

L'utilizzo della selezione delle tracce basata su vincoli offre diversi vantaggi rispetto alla selezione di canali specifici tra quelli disponibili:

  • Puoi specificare i vincoli prima di conoscere i dati di tracciamento forniti da un elemento multimediale. Ciò significa che i vincoli possono essere specificati prima che il player abbia preparato un elemento multimediale, mentre la selezione di tracce specifiche richiede che il codice dell'applicazione attenda finché i canali disponibili non diventano noti.
  • I vincoli vengono applicati a tutti gli elementi multimediali di una playlist, anche quando questi hanno tracce disponibili diverse. Ad esempio, a tutti gli elementi multimediali verrà applicato automaticamente un vincolo di lingua audio preferito, anche se il valore Format della traccia in quella lingua varia da un elemento multimediale all'altro. Questo non avviene quando si selezionano tracce specifiche, come descritto di seguito.

Selezione di tracce specifiche

È possibile selezionare tracce specifiche utilizzando TrackSelectionParameters. Innanzitutto, dovrebbe essere eseguita una query sulle tracce attualmente disponibili del player utilizzando Player.getCurrentTracks. Secondariamente, dopo aver identificato le tracce da selezionare, puoi impostarle su TrackSelectionParameters utilizzando un TrackSelectionOverride. Ad esempio, per selezionare la prima traccia di un audioTrackGroup specifico:

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 verrà applicato solo agli elementi multimediali che contengono un valore TrackGroup che corrisponde esattamente a quello specificato nella sostituzione. Di conseguenza, l'override potrebbe non essere applicato a un elemento multimediale successivo se l'elemento contiene tracce diverse.

Disattivazione dei tipi di canali o dei gruppi

I tipi di tracce come video, audio o testo possono essere disattivati completamente utilizzando TrackSelectionParameters.Builder.setTrackTypeDisabled. Un tipo di traccia disabilitato verrà disattivato per tutti gli elementi multimediali:

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

In alternativa, è possibile impedire la selezione delle tracce da un elemento TrackGroup specifico specificando un override vuoto per quel gruppo:

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

Personalizzazione del selettore di tracce

La selezione del canale è responsabilità di un TrackSelector, la cui istanza può essere fornita ogni volta che viene creata una ExoPlayer e successivamente ottenuta 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 è un TrackSelector flessibile adatto alla maggior parte dei casi d'uso. Utilizza il set TrackSelectionParameters in Player, ma offre anche alcune opzioni di personalizzazione avanzate che possono essere specificate in DefaultTrackSelector.ParametersBuilder:

Kotlin

trackSelector.setParameters(
  trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true))
)

Java

trackSelector.setParameters(
    trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));

Tunnel

Puoi abilitare la riproduzione con tunneling nei casi in cui la combinazione di renderer e le tracce selezionate la supporta. Per farlo, utilizza DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true).

Offload audio

Puoi abilitare la riproduzione audio offload nei casi in cui la combinazione di renderingr e tracce selezionate la supporta. Per farlo, specifica AudioOffloadModePreferences nel tuo 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());
);