Когда элемент мультимедиа содержит несколько дорожек, выбор дорожек — это процесс, который определяет, какие из них будут выбраны для воспроизведения. Процесс выбора дорожек настраивается TrackSelectionParameters
, что позволяет указать множество различных ограничений и переопределений, влияющих на выбор дорожек.
Запрос доступных треков
Вы можете прослушать Player.Listener.onTracksChanged
, чтобы получать уведомления об изменениях в треках, включая:
- Доступные треки становятся известны, когда подготовка воспроизводимого медиа-элемента завершена. Обратите внимание, что проигрывателю необходимо подготовить медиа-элемент, чтобы узнать, какие треки он содержит.
- Доступные дорожки меняются из-за перехода воспроизведения с одного медиафайла на другой.
- Изменения в выбранных треках.
Котлин
player.addListener( object : Player.Listener { override fun onTracksChanged(tracks: Tracks) { // Update UI using current tracks. } } )
Ява
player.addListener( new Player.Listener() { @Override public void onTracksChanged(Tracks tracks) { // Update UI using current tracks. } });
Вы также можете запросить текущие треки, вызвав player.getCurrentTracks()
. Возвращаемые Tracks
содержат список объектов Tracks.Group
, где треки в пределах одной Group
представляют одно и то же содержимое, но в разных форматах.
В качестве примера того, как можно группировать дорожки, рассмотрим адаптивное воспроизведение, где основной видеопоток предоставляется в пяти битрейтах, а альтернативный видеопоток (например, другой угол обзора в спортивном матче) предоставляется в двух битрейтах. В этом случае будет две группы видеодорожек, одна из которых соответствует основному видеопотоку, содержащему пять дорожек, а вторая — альтернативному видеопотоку, содержащему две дорожки.
Аудиодорожки, языки которых различаются, не группируются, поскольку контент на разных языках не считается одинаковым. И наоборот, аудиодорожки на одном языке, которые различаются только такими свойствами, как битрейт, частота дискретизации, количество каналов и т. д., могут быть сгруппированы. Это также относится к текстовым дорожкам.
Каждую Group
можно опросить, чтобы определить, какие дорожки поддерживаются для воспроизведения, какие из них выбраны в данный момент и какой Format
использует каждая дорожка:
Котлин
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) } }
Ява
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); } }
- Трек поддерживается , если
Player
может декодировать и рендерить его сэмплы. Обратите внимание, что даже если поддерживаются несколько групп треков одного типа (например, несколько групп аудиотреков), это означает только то, что они поддерживаются по отдельности, и проигрыватель не обязательно может воспроизводить их одновременно. - Трек выбирается , если он был выбран для воспроизведения с учетом текущего
TrackSelectionParameters
. Если выбрано несколько треков в одной группе треков, проигрыватель использует эти треки для адаптивного воспроизведения (например, несколько видеотреков с разными битрейтами). Обратите внимание, что только один из этих треков будет воспроизводиться в любой момент времени.
Изменение параметров выбора трека
Процесс выбора трека можно настроить с помощью Player.setTrackSelectionParameters
. Это можно сделать как до, так и во время воспроизведения. Следующий пример демонстрирует, как получить текущие TrackSelectionParameters
из проигрывателя, изменить их и обновить Player
с измененным результатом:
Котлин
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build()
Ява
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build());
Выбор пути на основе ограничений
Большинство опций в TrackSelectionParameters
позволяют вам указать ограничения, которые не зависят от фактически доступных треков. Доступные ограничения включают:
- Максимальная и минимальная ширина видео, высота, частота кадров и битрейт.
- Максимальное количество аудиоканалов и битрейт.
- Предпочтительные типы MIME для видео и аудио.
- Предпочтительные языки аудио и флаги ролей.
- Предпочтительные языки текста и флаги ролей.
ExoPlayer использует разумные значения по умолчанию для этих ограничений, например, ограничивая разрешение видео размером дисплея и отдавая предпочтение языку аудио, который соответствует настройкам локали системы пользователя.
Использование выбора треков на основе ограничений по сравнению с выбором конкретных треков из числа доступных имеет несколько преимуществ:
- Вы можете указать ограничения до того, как узнаете, какие треки предоставляет элемент мультимедиа. Это означает, что ограничения могут быть указаны до того, как проигрыватель подготовит элемент мультимедиа, тогда как выбор определенных треков требует, чтобы код приложения ждал, пока доступные треки не станут известны.
- Ограничения применяются ко всем элементам мультимедиа в плейлисте, даже если эти элементы имеют разные доступные дорожки. Например, ограничение предпочтительного языка аудио будет автоматически применено ко всем элементам мультимедиа, даже если
Format
дорожки на этом языке отличается от одного элемента мультимедиа к другому. Это не относится к выбору определенных дорожек, как описано ниже.
Выбор определенных треков
Можно выбрать определенные треки с помощью TrackSelectionParameters
. Во-первых, текущие доступные треки проигрывателя должны быть запрошены с помощью Player.getCurrentTracks
. Во-вторых, определив, какие треки выбрать, их можно задать в TrackSelectionParameters
с помощью TrackSelectionOverride
. Например, чтобы выбрать первый трек из определенной audioTrackGroup
:
Котлин
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setOverrideForType( TrackSelectionOverride(audioTrackGroup.mediaTrackGroup, /* trackIndex= */ 0) ) .build()
Ява
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setOverrideForType( new TrackSelectionOverride( audioTrackGroup.getMediaTrackGroup(), /* trackIndex= */ 0)) .build());
TrackSelectionOverride
будет применяться только к тем медиа-элементам, которые содержат TrackGroup
, точно совпадающую с указанной в переопределении. Следовательно, переопределение может не применяться к последующему медиа-элементу, если этот элемент содержит другие треки.
Отключение типов или групп треков
Такие типы дорожек, как видео, аудио или текст, можно полностью отключить с помощью TrackSelectionParameters.Builder.setTrackTypeDisabled
. Отключенный тип дорожки будет отключен для всех элементов мультимедиа:
Котлин
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true) .build()
Ява
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true) .build());
В качестве альтернативы можно запретить выбор треков из определенной TrackGroup
, указав пустое переопределение для этой группы:
Котлин
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .addOverride( TrackSelectionOverride(disabledTrackGroup.mediaTrackGroup, /* trackIndices= */ listOf()) ) .build()
Ява
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .addOverride( new TrackSelectionOverride( disabledTrackGroup.getMediaTrackGroup(), /* trackIndices= */ ImmutableList.of())) .build());
Настройка селектора треков
Выбор трека является обязанностью TrackSelector
, экземпляр которого может быть предоставлен при каждом создании ExoPlayer
и позднее получен с помощью ExoPlayer.getTrackSelector()
.
Котлин
val trackSelector = DefaultTrackSelector(context) val player = ExoPlayer.Builder(context).setTrackSelector(trackSelector).build()
Ява
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context); ExoPlayer player = new ExoPlayer.Builder(context).setTrackSelector(trackSelector).build();
DefaultTrackSelector
— гибкий TrackSelector
, подходящий для большинства случаев использования. Он использует TrackSelectionParameters
, установленный в Player
, но также предоставляет некоторые расширенные параметры настройки, которые можно указать в DefaultTrackSelector.ParametersBuilder
:
Котлин
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true)) )
Ява
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));
Туннелирование
Вы можете включить туннелированное воспроизведение в случаях, когда комбинация рендереров и выбранных дорожек поддерживает это. Для этого используйте DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)
.
Аудиовыгрузка
Вы можете включить воспроизведение звука с разгрузкой в случаях, когда комбинация рендереров и выбранных дорожек поддерживает это. Для этого укажите AudioOffloadModePreferences
в TrackSelectionParameters
.
Котлин
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()
Ява
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()); );