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