Quando un elemento multimediale contiene più tracce, la selezione delle tracce è il processo che determina quali di esse vengono scelte per la riproduzione. Il processo di selezione delle tracce è configurato da TrackSelectionParameters
, il che consente di specificare molti vincoli e override che influiscono sulla selezione delle tracce.
Esecuzione di query sulle tracce disponibili
Puoi ascoltare Player.Listener.onTracksChanged
per ricevere notifiche sulle modifiche apportate alle tracce, tra cui:
- Le tracce disponibili diventano note al termine della preparazione dell'elemento multimediale riprodotto. Tieni presente che il player deve preparare un elemento multimediale per sapere quali tracce contiene.
- Le tracce disponibili cambiano a causa del passaggio 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 correnti chiamando player.getCurrentTracks()
.
Il valore Tracks
restituito contiene un elenco di oggetti Track.Group
, in cui le tracce all'interno di un
singolo Group
presentano gli stessi contenuti ma in formati diversi.
Per un esempio di raggruppamento delle tracce, considera una riproduzione adattiva in cui il feed video principale viene fornito con cinque velocità in bit e un feed video alternativo (ad esempio un angolo di ripresa diverso in una partita di calcio) viene fornito con due velocità in bit. 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.
Tracce audio le cui lingue diverse non sono raggruppate, perché i contenuti in lingue diverse non sono considerati uguali. Viceversa, le tracce audio nella stessa lingua, che differiscono solo per proprietà come velocità in bit, 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 quali 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 esempi. Tieni presente che anche se sono supportati più gruppi di tracce dello stesso tipo (ad esempio, più gruppi di tracce audio), significa solo che vengono supportati singolarmente e il player non è necessariamente in grado di riprodurli contemporaneamente. - Una traccia viene selezionata se è stata scelta per la riproduzione in base all'attuale
TrackSelectionParameters
. Se vengono selezionate più tracce in un gruppo di tracce, il player le utilizza per la riproduzione adattiva (ad esempio, più tracce video con velocità in bit diverse). Tieni presente che verrà riprodotta una sola di queste tracce alla volta.
Modifica dei parametri per la selezione dei canali
Il processo di selezione delle tracce può essere configurato utilizzando
Player.setTrackSelectionParameters
. Puoi farlo sia prima che durante
la riproduzione. L'esempio seguente mostra come ottenere l'attuale TrackSelectionParameters
dal player, modificarli 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 basata su vincolo
La maggior parte delle opzioni in TrackSelectionParameters
consente di specificare vincoli, che sono indipendenti dai canali effettivamente disponibili. I vincoli disponibili includono:
- Larghezza, altezza, frequenza fotogrammi massima e minima del video e velocità in bit.
- Numero massimo di canali audio e velocità in bit.
- Tipi MIME preferiti per video e audio.
- Lingue dell'audio preferite e flag dei ruoli.
- Lingue di testo e flag dei ruoli preferiti.
ExoPlayer utilizza valori predefiniti appropriati per questi vincoli, ad esempio limitando la risoluzione dei video alle dimensioni di visualizzazione e preferendo la lingua audio che corrisponde all'impostazione internazionale del sistema dell'utente.
L'utilizzo della selezione delle tracce basata su vincoli offre diversi vantaggi rispetto alla selezione di canali specifici tra quelli disponibili:
- Puoi specificare i vincoli prima di conoscere i dati di tracciamento forniti da 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 finché i canali disponibili non diventano noti.
- I vincoli vengono applicati a tutti gli elementi multimediali di una playlist, anche quando questi
hanno tracce disponibili diverse. Ad esempio, a tutti gli elementi multimediali verrà applicato automaticamente un vincolo di lingua audio preferito, anche se il valore
Format
della traccia in quella lingua varia da un elemento multimediale all'altro. Questo non avviene quando si selezionano tracce specifiche, come descritto di seguito.
Selezione di tracce specifiche
È possibile selezionare tracce specifiche utilizzando TrackSelectionParameters
. Innanzitutto,
dovrebbe essere eseguita una query sulle tracce attualmente disponibili del player utilizzando
Player.getCurrentTracks
. Secondariamente, dopo aver identificato le tracce da selezionare,
puoi impostarle 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
verrà applicato solo agli elementi multimediali che contengono un valore TrackGroup
che corrisponde esattamente a quello specificato nella sostituzione. Di conseguenza, l'override potrebbe non essere applicato a un elemento multimediale successivo se l'elemento 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 traccia disabilitato 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 delle tracce da un elemento
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());
Personalizzazione del selettore di tracce
La selezione del canale è responsabilità di un TrackSelector
, la cui istanza può essere fornita ogni volta che viene creata una 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 set TrackSelectionParameters
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));
Tunnel
Puoi abilitare la riproduzione con tunneling nei casi in cui la combinazione di renderer e
le tracce selezionate la supporta. Per farlo, utilizza DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)
.
Offload audio
Puoi abilitare la riproduzione audio offload nei casi in cui la combinazione di renderingr e tracce selezionate la 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()); );