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