БРОСАТЬСЯ

ExoPlayer поддерживает DASH с несколькими форматами контейнеров. Медиапотоки должны быть демультиплексированы, то есть видео, аудио и текст должны быть определены в отдельных элементах AdaptationSet в манифесте DASH (CEA-608 является исключением, как описано в таблице ниже). Содержащиеся форматы образцов аудио и видео также должны поддерживаться (подробности см. в разделе «Форматы примеров» ).

Особенность Поддерживается Комментарии
Контейнеры
ФМП4 ДА Только демультиплексированные потоки
ВебМ ДА Только демультиплексированные потоки
Матроска ДА Только демультиплексированные потоки
MPEG-TS НЕТ Поддержка не планируется
Скрытые субтитры/субтитры
ТТМЛ ДА Необработанный или встроенный в FMP4 согласно ISO/IEC 14496-30.
ВебВТТ ДА Необработанный или встроенный в FMP4 согласно ISO/IEC 14496-30.
СЕА-608 ДА Встроен в FMP4 при использовании дескрипторов доступности SCTE.
СЕА-708 ДА Встроен в FMP4 при использовании дескрипторов доступности SCTE.
Метаданные
Метаданные ЭМСГ ДА Встроенный в FMP4
Защита контента
Широкая лоза ДА Схема «cenc»: API 19+; Схема «cbcs»: API 25+
PlayReady SL2000 ДА Android TV, только схема «cenc»
ClearKey ДА API 21+, только схема «cenc»
Живое воспроизведение
Регулярное живое воспроизведение ДА
Живое воспроизведение CMAF со сверхмалой задержкой ДА
Общие данные медиаклиента (CMCD) ДА Руководство по интеграции

Использование Медиаитем

Чтобы воспроизводить поток DASH, вам необходимо зависеть от модуля DASH.

Котлин

implementation("androidx.media3:media3-exoplayer-dash:1.4.1")

классный

implementation "androidx.media3:media3-exoplayer-dash:1.4.1"

Затем вы можете создать MediaItem для URI DASH MPD и передать его проигрывателю.

Котлин

// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(dashUri))
// Prepare the player.
player.prepare()

Ява

// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(dashUri));
// Prepare the player.
player.prepare();

Если ваш URI не заканчивается на .mpd , вы можете передать MimeTypes.APPLICATION_MPD в setMimeType MediaItem.Builder , чтобы явно указать тип содержимого.

ExoPlayer автоматически адаптируется между представлениями, определенными в манифесте, принимая во внимание как доступную пропускную способность, так и возможности устройства.

Использование DashMediaSource

Для получения дополнительных возможностей настройки вы можете создать DashMediaSource и передать его непосредственно проигрывателю вместо MediaItem .

Котлин

val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory()
// Create a dash media source pointing to a dash manifest uri.
val mediaSource: MediaSource =
  DashMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(dashUri))
// Create a player instance which gets an adaptive track selector by default.
val player = ExoPlayer.Builder(context).build()
// Set the media source to be played.
player.setMediaSource(mediaSource)
// Prepare the player.
player.prepare()

Ява

DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();
// Create a dash media source pointing to a dash manifest uri.
MediaSource mediaSource =
    new DashMediaSource.Factory(dataSourceFactory)
        .createMediaSource(MediaItem.fromUri(dashUri));
// Create a player instance which gets an adaptive track selector by default.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media source to be played.
player.setMediaSource(mediaSource);
// Prepare the player.
player.prepare();

Доступ к манифесту

Вы можете получить текущий манифест, вызвав Player.getCurrentManifest . Для DASH вам следует привести возвращаемый объект к DashManifest . Обратный вызов onTimelineChanged Player.Listener также вызывается при каждой загрузке манифеста. Это произойдет один раз для контента по запросу и, возможно, много раз для контента в реальном времени. В следующем фрагменте кода показано, как приложение может что-то делать при загрузке манифеста.

Котлин

player.addListener(
  object : Player.Listener {
    override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) {
      val manifest = player.currentManifest
      if (manifest is DashManifest) {
        // Do something with the manifest.
      }
    }
  }
)

Ява

player.addListener(
    new Player.Listener() {
      @Override
      public void onTimelineChanged(
          Timeline timeline, @Player.TimelineChangeReason int reason) {
        Object manifest = player.getCurrentManifest();
        if (manifest != null) {
          DashManifest dashManifest = (DashManifest) manifest;
          // Do something with the manifest.
        }
      }
    });

Настройка воспроизведения

ExoPlayer предоставляет вам несколько способов адаптировать воспроизведение к потребностям вашего приложения. Примеры см. на странице «Настройки» .