Выбор трека

Если элемент мультимедиа содержит несколько дорожек, выбор дорожки — это процесс, который определяет, какая из них выбрана для воспроизведения. Процесс выбора трека настраивается с помощью 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 содержат список объектов Track.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());
);