Selezione traccia

Quando un elemento multimediale contiene più tracce, la selezione delle tracce è il processo che determina quali di questi vengono scelti per la riproduzione. Il processo di selezione delle tracce configurato da TrackSelectionParameters, che consente molte diverse i vincoli e gli override 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 durante la preparazione dell'elemento multimediale riprodotte. Tieni presente che il player deve preparare un elemento multimediale da conoscere. quali tracce contiene.
  • Le tracce disponibili cambiano a causa del passaggio della riproduzione da un contenuto multimediale da un elemento 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(). L'elemento Tracks restituito contiene un elenco di Track.Group oggetti, in cui tiene traccia di un Group presenta gli stessi contenuti, ma in formati diversi.

Come esempio di come raggruppare le tracce, considera la riproduzione adattiva in cui viene fornito un feed video principale con cinque velocità in bit e un feed video alternativo (ad esempio, un'angolazione diversa della videocamera in una partita di calcio) viene fornita con due velocità in bit. In questo caso ci saranno due gruppi di tracce video, uno corrispondente al feed video contenente cinque tracce e un secondo per il feed video alternativo contenente due tracce.

Le tracce audio le cui lingue diverse non sono raggruppate, perché i contenuti lingue diverse non sono considerate la stessa cosa. Al contrario, le tracce audio nella stessa lingua che si differenziano solo per proprietà quali velocità in bit, campionamento frequenza, numero di canali e così via. Questo vale anche per le tracce di testo.

È possibile eseguire query su ogni Group per determinare quali tracce sono supportate riproduzione, che sono attualmente selezionati, e cosa 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 i campioni. Tieni presente che anche se più gruppi di monitoraggio dello stesso tipo (ad esempio gruppi di tracce audio) sono supportati, significa solo che supportati individualmente e il player non è necessariamente in grado di riprodurli su contemporaneamente.
  • Una traccia viene selezionata se è stata scelta per la riproduzione sulla base della configurazione attuale TrackSelectionParameters. Se più tracce all'interno di un gruppo di tracce vengono selezionata, il player usa queste tracce per la riproduzione adattiva (ad esempio, diverse tracce video con velocità in bit diverse). Tieni presente che solo uno di questi verranno riprodotte contemporaneamente.

Modifica dei parametri di selezione delle tracce

Il processo di selezione delle tracce può essere configurato utilizzando Player.setTrackSelectionParameters. Puoi eseguire questa operazione sia prima che durante per riprodurre un video. L'esempio seguente mostra come ottenere il valore TrackSelectionParameters dal player, modificali e aggiorna 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 vincoli

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

  • Larghezza, altezza, frequenza fotogrammi e velocità in bit massime e minime del video.
  • Numero massimo di canali audio e velocità in bit.
  • Tipi MIME preferiti per video e audio.
  • Lingue preferite per l'audio e flag di ruolo.
  • Lingue di testo preferite e flag di ruolo.

ExoPlayer utilizza valori predefiniti sensibili per questi vincoli, ad esempio limitando risoluzione video alla dimensione del display e preferisce la lingua dell'audio corrispondono alle impostazioni internazionali di sistema dell'utente.

L'utilizzo della selezione delle tracce basata su vincoli anziché sull'utilizzo di selezionando tracce specifiche tra quelle disponibili:

  • Puoi specificare i vincoli prima di sapere quali tracce vengono fornite da un elemento multimediale. Ciò significa che è possibile specificare i vincoli prima che il player abbia preparato elemento multimediale, mentre la selezione di tracce specifiche richiede l'utilizzo di un codice dell'applicazione e attenderemo che vengano rese note le tracce disponibili.
  • I vincoli vengono applicati a tutti gli elementi multimediali in una playlist, anche quando elementi hanno tracce disponibili diverse. Ad esempio, una lingua preferita per l'audio verrà applicato automaticamente a tutti gli elementi multimediali, anche se Format della traccia in quella lingua varia da un elemento multimediale all'altro. Questo non avviene quando selezioni tracce specifiche, come descritto di seguito.

Selezionare tracce specifiche

Puoi selezionare tracce specifiche utilizzando TrackSelectionParameters. Per prima cosa, occorre eseguire query sulle tracce attualmente disponibili del player utilizzando Player.getCurrentTracks. In secondo luogo, dopo aver identificato le tracce da selezionare, possono essere impostate su TrackSelectionParameters utilizzando un TrackSelectionOverride. Ad esempio, per selezionare la prima traccia di uno specifico audioTrackGroup:

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

L'elemento TrackSelectionOverride verrà applicato solo agli elementi multimediali che contengono un TrackGroup corrisponde esattamente a quello specificato nella sostituzione. Di conseguenza, la sostituzione potrebbe non essere applicata a un elemento multimediale successivo se quest'ultimo 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 canale disattivato verrà disattivata 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 una specifica TrackGroup specificando un override vuoto per il 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 della traccia è a carico di un TrackSelector, un'istanza di cui è possibile fornire ogni volta che un ExoPlayer viene creato e ottenuto 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 dell'uso d'uso diversi. Usa il valore TrackSelectionParameters impostato in Player, ma anche fornisce alcune opzioni di personalizzazione avanzate, che possono essere specificate nel DefaultTrackSelector.ParametersBuilder:

Kotlin

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

Java

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

Tunnel

Puoi attivare la riproduzione con tunnel nei casi in cui la combinazione di renderer e le tracce selezionate lo supportano. A questo scopo, utilizza DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true).

Offload audio

Puoi attivare la riproduzione audio scaricata nei casi in cui la combinazione i renderer e le tracce selezionate lo supportano. A questo scopo, 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());
);