Если в медиафайле несколько дорожек, то при воспроизведении выбираются некоторые из них. Выбор дорожки настраивается с помощью TrackSelectionParameters, который позволяет задавать различные ограничения и переопределения, влияющие на выбор дорожки.
Как запрашивать доступные треки
Вы можете слушать Player.Listener.onTracksChanged, чтобы получать уведомления об изменениях в треках, в том числе:
- Доступные дорожки становятся известны после завершения подготовки медиаконтента к воспроизведению. Обратите внимание, что проигрывателю нужно подготовить медиаконтент, чтобы узнать, какие дорожки в нем есть.
- Доступные дорожки меняются, когда воспроизведение переходит с одного медиаобъекта на другой.
- Изменения в выбранных треках.
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. } });
Вы также можете запросить текущие треки, вызвав метод player.getCurrentTracks().
Возвращаемый объект Tracks содержит список объектов Tracks.Group, в которых треки в одном объекте Group представляют один и тот же контент, но в разных форматах.
Например, при адаптивном воспроизведении основной видеопоток может быть представлен в пяти вариантах битрейта, а альтернативный (например, с другим углом съемки спортивного матча) – в двух. В этом случае будет две группы видеодорожек: одна для основного видеофида с пятью дорожками, а вторая – для альтернативного видеофида с двумя дорожками.
Звуковые дорожки на разных языках не группируются, поскольку контент на разных языках не считается одинаковым. Аудиодорожки на одном языке, которые отличаются только такими свойствами, как битрейт, частота дискретизации, количество каналов и т. д., можно сгруппировать. Это также относится к текстовым дорожкам.
Каждый элемент Group можно запросить, чтобы определить, какие треки поддерживаются для воспроизведения, какие выбраны в данный момент и какой элемент Format используется в каждом треке:
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); } }
- Дорожка поддерживается, если
Playerможет декодировать и воспроизводить ее образцы. Обратите внимание, что даже если поддерживается несколько групп дорожек одного типа (например, несколько групп аудиодорожек), это означает, что они поддерживаются по отдельности и проигрыватель не обязательно сможет воспроизвести их одновременно. - Дорожка выбрана, если она воспроизводится с учетом текущего значения параметра
TrackSelectionParameters. Если в группе выбрано несколько дорожек, проигрыватель использует их для адаптивного воспроизведения (например, несколько видеодорожек с разным битрейтом). Обратите внимание, что одновременно может воспроизводиться только одна из этих дорожек.
Как изменить параметры выбора дорожек
Процесс выбора дорожки можно настроить с помощью параметра Player.setTrackSelectionParameters. Это можно сделать как до, так и во время воспроизведения. В следующем примере показано, как получить текущие значения TrackSelectionParameters из проигрывателя, изменить их и обновить Player с помощью измененных значений:
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build()
Java
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build());
Выбор дорожки на основе ограничений
Большинство вариантов в TrackSelectionParameters позволяют задавать ограничения, которые не зависят от доступных версий. Доступны следующие ограничения:
- Максимальная и минимальная ширина, высота, частота кадров и битрейт видео.
- Максимальное количество аудиоканалов и битрейт.
- Предпочтительные MIME-типы для видео и аудио.
- Предпочитаемые языки аудиодорожек и флаги ролей.
- Предпочитаемые языки текста и флаги ролей.
ExoPlayer использует разумные значения по умолчанию для этих ограничений, например ограничивает разрешение видео размером экрана и выбирает язык аудио, соответствующий системным настройкам пользователя.
Выбор дорожек на основе ограничений имеет ряд преимуществ по сравнению с выбором определенных дорожек из доступных:
- Ограничения можно задать до того, как вы узнаете, какие дорожки есть в медиаобъекте. Это означает, что ограничения можно задать до того, как проигрыватель подготовит медиаконтент, а для выбора определенных дорожек код приложения должен дождаться, пока не станут известны доступные дорожки.
- Ограничения применяются ко всем медиафайлам в плейлисте, даже если для них доступны разные дорожки. Например, ограничение на предпочитаемый язык аудиодорожки будет автоматически применено ко всем медиаобъектам, даже если
Formatдорожки на этом языке будет отличаться в разных медиаобъектах. При выборе определенных треков это не так, как описано ниже.
Как выбрать дорожку
Выбрать определенные дорожки можно с помощью TrackSelectionParameters. Сначала нужно запросить доступные дорожки с помощью Player.getCurrentTracks. Во-вторых, определив, какие дорожки нужно выбрать, их можно задать в теге TrackSelectionParameters с помощью тега TrackSelectionOverride.
Например, чтобы выбрать первую дорожку из определенного 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());
TrackSelectionOverride будет применяться только к медиаобъектам, содержащим TrackGroup, точно соответствующий указанному в переопределении. Поэтому переопределение может не применяться к следующему медиаобъекту, если он содержит другие дорожки.
Отключение типов дорожек или групп
Типы дорожек, например видео, аудио или текст, можно полностью отключить с помощью TrackSelectionParameters.Builder.setTrackTypeDisabled. Отключенный тип дорожки будет отключен для всех медиаобъектов:
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());
Также можно запретить выбор дорожек из определенной группы TrackGroup, указав для нее пустое переопределение:
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());
Как настроить выбор дорожек
Выбор трека осуществляется с помощью TrackSelector, экземпляр которого можно предоставить при создании ExoPlayer, а затем получить с помощью 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 – это гибкий TrackSelector, подходящий для большинства случаев использования. Он использует TrackSelectionParameters, заданный в Player, но также предоставляет некоторые дополнительные возможности настройки, которые можно указать в DefaultTrackSelector.ParametersBuilder:
Kotlin
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true) )
Java
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));
Туннелирование
Туннелирование может помочь эффективно воспроизводить видео с высоким разрешением на некоторых телевизорах. Дополнительную информацию можно найти на странице Расход заряда батареи.
Вы можете включить туннельное воспроизведение, если оно поддерживается сочетанием рендереров и выбранных дорожек. Для этого используйте метод DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true).
Выгрузка аудио
Разгрузка аудио может помочь сэкономить заряд батареи, особенно при длительном воспроизведении с выключенным экраном. Дополнительную информацию можно найти на странице Расход заряда батареи.
Вы можете задать настройки для воспроизведения аудио с разгрузкой, чтобы включить его, если сочетание рендереров и выбранных дорожек поддерживает эту функцию. Для этого укажите AudioOffloadModePreferences в 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());