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

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 предоставляет несколько способов настройки воспроизведения под нужды вашего приложения. Примеры см. на странице «Настройка» .