Selezione traccia

Quando un elemento multimediale contiene più tracce, la selezione delle tracce è il processo che determina quali vengono scelte per la riproduzione. La procedura di selezione delle tracce viene configurata da TrackSelectionParameters, che consente di specificare molti diversi vincoli e sostituzioni che influiscono sulla selezione delle tracce.

Eseguire query sui canali disponibili

Puoi ascoltare Player.Listener.onTracksChanged per ricevere notifiche sulle modifiche ai canali, tra cui:

  • Le tracce disponibili diventano note al termine della preparazione dell'elemento multimediale in riproduzione. Tieni presente che il player deve preparare un elemento multimediale per sapere quali tracce contiene.
  • Le tracce disponibili cambiano a causa del passaggio dalla riproduzione di un elemento media a un altro.
  • Modifiche ai canali selezionati.

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 sui canali attuali chiamando player.getCurrentTracks(). Il valore Tracks restituito contiene un elenco di oggetti Tracks.Group, in cui le tracce all'interno di un singolo Group presentano gli stessi contenuti, ma in formati diversi.

Come esempio di come le tracce possono essere raggruppate, prendiamo in considerazione una riproduzione adattiva in cui un feed video principale viene fornito in cinque bitrate e un feed video alternativo (ad esempio un angolo di ripresa diverso in una partita sportiva) viene fornito in due bitrate. In questo caso, ci saranno due gruppi di tracce video, uno corrispondente al feed video principale contenente cinque tracce e un altro per il feed video alternativo contenente due tracce.

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

Per ogni Group è possibile eseguire una query per determinare quali canali sono supportati per la riproduzione, quali sono attualmente selezionati e quale Format utilizza ogni canale:

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 canale è supportato se il Player è in grado di decodificare e eseguire il rendering dei suoi campioni. Tieni presente che anche se sono supportati più gruppi di tracce dello stesso tipo (ad esempio più gruppi di tracce audio), significa solo che sono supportati singolarmente e che il player non è necessariamente in grado di riprodurli contemporaneamente.
  • Una traccia è selezionata se è stata scelta per la riproduzione in base al valore correnteTrackSelectionParameters. Se vengono selezionate più tracce all'interno di un gruppo di tracce, il player le utilizza per la riproduzione adattiva (ad esempio, più tracce video con bitrate diverse). Tieni presente che verrà riprodotto solo uno di questi canali alla volta.

Modifica dei parametri di selezione dei canali

La procedura di selezione dei canali può essere configurata utilizzando Player.setTrackSelectionParameters. Puoi farlo sia prima che durante la riproduzione. L'esempio seguente mostra come ottenere il valore corrente di TrackSelectionParameters dal player, modificarlo 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 in base ai vincoli

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

  • Larghezza, altezza, frequenza fotogrammi e velocità in bit video massimi e minimi.
  • Numero massimo di canali audio e bitrate.
  • Tipi MIME preferiti per video e audio.
  • Lingue audio preferite e indicatori di ruolo.
  • Lingue di testo e indicatori di ruolo preferiti.

ExoPlayer utilizza impostazioni predefinite ragionevoli per questi vincoli, ad esempio limita la risoluzione video alle dimensioni del display e preferisce la lingua audio che corrisponde all'impostazione di impostazione internazionale del sistema dell'utente.

L'utilizzo della selezione dei canali in base a vincoli anziché selezionare canali specifici tra quelli disponibili offre diversi vantaggi:

  • Puoi specificare i vincoli prima di sapere quali tracce fornisce 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 aspetti che le tracce disponibili siano note.
  • I vincoli vengono applicati a tutti gli elementi multimediali di una playlist, anche se questi elementi hanno tracce disponibili diverse. Ad esempio, un vincolo per la lingua audio preferita verrà applicato automaticamente a tutti gli elementi multimediali, anche se il Format della traccia in quella lingua varia da un elemento multimediale all'altro. Non è così se selezioni canali specifici, come descritto di seguito.

Selezionare tracce specifiche

È possibile selezionare tracce specifiche utilizzando TrackSelectionParameters. Innanzitutto, è necessario eseguire una query sulle tracce attualmente disponibili del player utilizzando Player.getCurrentTracks. In secondo luogo, dopo aver identificato i canali da selezionare, possono essere impostati su TrackSelectionParameters utilizzando un TrackSelectionOverride. Ad esempio, per selezionare la prima traccia da 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 TrackGroup corrispondente esattamente a quello specificato nell'override. Pertanto, un override potrebbe non essere applicato a un elemento multimediale successivo se contiene tracce diverse.

Disattivare gruppi o tipi di tracce

I tipi di tracce, come video, audio o testo, possono essere disattivati completamente utilizzando TrackSelectionParameters.Builder.setTrackTypeDisabled. Un tipo di traccia disattivato viene 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 di tracce da unTrackGroup 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());

Personalizzare il selettore di tracce

La selezione dei canali è responsabilità di un TrackSelector, un'istanza di cui è possibile fornire una ogni volta che viene creato un 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 valore TrackSelectionParameters impostato 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));

Tunneling

Puoi attivare la riproduzione in tunnel nei casi in cui la combinazione di visualizzatori e canali selezionati lo supporti. Per farlo, usa DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true).

Trasferimento audio

Puoi attivare la riproduzione audio offloaded nei casi in cui la combinazione di visualizzatori e tracce selezionate lo supporti. A tal fine, specifica AudioOffloadModePreferences in 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());
);