Плавная потоковая передача

ExoPlayer поддерживает SmoothStreaming с форматом контейнера FMP4. Медиапотоки должны быть демультиплексированы, то есть видео, аудио и текст должны быть определены в отдельных элементах StreamIndex в манифесте SmoothStreaming. Также должны поддерживаться содержащиеся в них форматы аудио- и видеоматериалов (подробнее см. в разделе «Форматы материалов» ).

Особенность Поддерживается Комментарии
Контейнеры
ФМП4 ДА Только демультиплексированные потоки
Скрытые субтитры
ТТМЛ ДА Встроено в FMP4
Защита контента
PlayReady SL2000 ДА только Android TV
Живое воспроизведение
Регулярное живое воспроизведение ДА
Общие данные клиента медиа (CMCD) ДА Руководство по интеграции

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

Для воспроизведения потока SmoothStreaming вам необходимо использовать модуль SmoothStreaming.

Котлин

implementation("androidx.media3:media3-exoplayer-smoothstreaming:1.7.1")

Круто

implementation "androidx.media3:media3-exoplayer-smoothstreaming:1.7.1"

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

Котлин

// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(ssUri))
// 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(ssUri));
// Prepare the player.
player.prepare();

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

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

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

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

Котлин

// Create a data source factory.
val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory()
// Create a SmoothStreaming media source pointing to a manifest uri.
val mediaSource: MediaSource =
  SsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(ssUri))
// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media source to be played.
player.setMediaSource(mediaSource)
// Prepare the player.
player.prepare()

Ява

// Create a data source factory.
DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();
// Create a SmoothStreaming media source pointing to a manifest uri.
MediaSource mediaSource =
    new SsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(ssUri));
// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media source to be played.
player.setMediaSource(mediaSource);
// Prepare the player.
player.prepare();

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

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

Котлин

player.addListener(
  object : Player.Listener {
    override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) {
      val manifest = player.currentManifest
      if (manifest is SsManifest) {
        // 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) {
          SsManifest ssManifest = (SsManifest) manifest;
          // Do something with the manifest.
        }
      }
    });

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

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