Выбор трека

Когда медиафайл содержит несколько дорожек, выбор дорожки — это процесс, определяющий, какая из них будет выбрана для воспроизведения. Процесс выбора дорожки настраивается параметром TrackSelectionParameters , который позволяет задавать множество различных ограничений и переопределений, влияющих на выбор дорожки.

Запрос доступных треков

Вы можете прослушивать событие Player.Listener.onTracksChanged , чтобы получать уведомления об изменениях в треках, в том числе:

  • Доступные треки становятся известны после завершения подготовки воспроизводимого медиафайла. Обратите внимание, что для того, чтобы узнать, какие треки содержит медиафайл, плеер должен его подготовить.
  • Доступные треки меняются в связи с переходом от одного медиафайла к другому при воспроизведении.
  • Изменения в выбранных треках.

Котлин

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 используется для каждой дорожки:

Котлин

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 измененным результатом:

Котлин

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 :

Котлин

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 . Отключенный тип дорожки будет отключен для всех медиафайлов:

Котлин

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 , указав для этой группы пустое значение для переопределения:

Котлин

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() .

Котлин

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 :

Котлин

trackSelector.setParameters(
  trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true)
)

Java

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

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