Selezione traccia

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

Esecuzione di query sulle tracce disponibili

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

  • Le tracce disponibili diventano note al termine della preparazione dell'elemento multimediale in riproduzione. Tieni presente che il lettore deve preparare un elemento multimediale per sapere quali tracce contiene.
  • Le tracce disponibili cambiano a causa della transizione 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 attuali chiamando player.getCurrentTracks(). L'oggetto Tracks restituito contiene un elenco di oggetti Tracks.Group, in cui le tracce all'interno di un singolo Group presentano lo stesso contenuto, ma in formati diversi.

Come esempio di come possono essere raggruppate le tracce, considera una riproduzione adattiva in cui un feed video principale viene fornito in cinque bitrate e un feed video alternativo (ad esempio, un'angolazione diversa della telecamera 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 secondo 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 gli stessi. Al contrario, le tracce audio nella stessa lingua che differiscono solo per proprietà come bitrate, 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 quale 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 riprodurre i relativi campioni. Tieni presente che, anche se sono supportati più gruppi di tracce dello stesso tipo (ad esempio più gruppi di tracce audio), ciò 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 all'attuale TrackSelectionParameters. 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 diversi). Tieni presente che solo una di queste tracce verrà riprodotta alla volta.

Modifica dei parametri di selezione delle tracce

Il processo di selezione delle tracce può essere configurato utilizzando Player.setTrackSelectionParameters. Puoi farlo sia prima che durante la riproduzione. Il seguente esempio mostra come ottenere gli attuali TrackSelectionParameters dal giocatore, modificarli e aggiornare i 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 sui vincoli

La maggior parte delle opzioni in TrackSelectionParameters consente di specificare vincoli, indipendenti dalle tracce effettivamente disponibili. I vincoli disponibili includono:

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

ExoPlayer utilizza valori predefiniti ragionevoli per questi vincoli, ad esempio limitando la risoluzione video alle dimensioni del display e preferendo la lingua audio che corrisponde all'impostazione delle impostazioni internazionali del sistema dell'utente.

L'utilizzo della selezione delle tracce basata sui vincoli offre diversi vantaggi rispetto alla selezione di tracce specifiche tra quelle disponibili:

  • 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 attenda che le tracce disponibili diventino note.
  • I vincoli vengono applicati a tutti gli elementi multimediali di una playlist, anche quando questi elementi hanno tracce disponibili diverse. Ad esempio, un vincolo di 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. Ciò non avviene quando si selezionano tracce specifiche, come descritto di seguito.

Selezionare tracce specifiche

È possibile selezionare tracce specifiche utilizzando TrackSelectionParameters. Innanzitutto, le tracce attualmente disponibili del giocatore devono essere richieste utilizzando Player.getCurrentTracks. In secondo luogo, una volta identificate le tracce da selezionare, possono essere impostate 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 si applica 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 questo contiene tracce diverse.

Disattivare i tipi o i gruppi di tracce

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

Personalizzare il selettore delle tracce

La selezione delle tracce è responsabilità di un TrackSelector, di cui può essere fornita un'istanza ogni volta che viene creato un ExoPlayer e ottenuta in un secondo momento 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 TrackSelectionParameters impostato in Player, ma fornisce 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

Il tunneling può contribuire alla riproduzione efficiente di video in streaming ad alta risoluzione su alcuni dispositivi TV. Per ulteriori note e dettagli, consulta la pagina Consumo della batteria.

Puoi impostare una preferenza per la riproduzione in tunnel per attivarla nei casi in cui la combinazione di renderer e tracce selezionate la supporta. Per farlo, utilizza DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true).

Trasferimento audio

L'offload audio può contribuire a risparmiare energia, in particolare per le riproduzioni più lunghe con lo schermo spento. Per ulteriori note e dettagli, consulta la pagina Consumo batteria.

Puoi impostare le preferenze per la riproduzione audio scaricata per attivarla nei casi in cui la combinazione di renderer e tracce selezionate lo 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());