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