DASH

ExoPlayer 支援多個容器格式的 DASH。媒體串流必須經過解多工處理,也就是說,影片、音訊和文字必須在 DASH 資訊清單中的不同 AdaptationSet 元素中定義 (CEA-608 除外,請參閱下表)。所含的音訊和視訊樣本格式也必須支援 (詳情請參閱「樣本格式」一節)。

功能 支援 留言
容器
FMP4 僅限已解串流的串流
WebM 僅限已解串流的串流
Matroska 僅限已解串流的串流
MPEG-TS 無支援計畫
隱藏式輔助字幕 / 字幕
TTML 原始格式,或根據 ISO/IEC 14496-30 嵌入 FMP4
WebVTT 原始格式,或根據 ISO/IEC 14496-30 嵌入 FMP4
CEA-608 使用 SCTE 無障礙描述符發出訊號時,會嵌入 FMP4
CEA-708 使用 SCTE 無障礙描述符發出訊號時,會嵌入 FMP4
Metadata
EMSG 中繼資料 嵌入 FMP4
內容保護
Widevine 「cenc」配置:API 19 以上版本;「cbcs」配置:API 25 以上版本
PlayReady SL2000 Android TV,僅限「cenc」配置
ClearKey API 21 以上版本,僅限「cenc」配置文件
廣告插播
多時段播放
伺服器引導廣告插入 (xlinks)
IMA 伺服器端和用戶端廣告 廣告插播指南
即時播放
一般直播播放
超低延遲 CMAF 即時播放功能
通用媒體用戶端資料 (CMCD) CMCD 整合指南

使用 MediaItem

如要播放 DASH 串流,您必須依附 DASH 模組。

Kotlin

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

Groovy

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

接著,您可以為 DASH MPD URI 建立 MediaItem,並將其傳遞至播放器。

Kotlin

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

Java

// 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 傳遞至 MediaItem.BuildersetMimeType,明確指出內容類型。

ExoPlayer 會考量可用頻寬和裝置功能,自動在資訊清單中定義的表示法之間進行調整。

使用 DashMediaSource

如需更多自訂選項,您可以建立 DashMediaSource,並直接將其傳遞給播放器,而非 MediaItem

Kotlin

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

Java

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。每次載入資訊清單時,系統也會呼叫 Player.ListeneronTimelineChanged 回呼。這項作業會針對隨選內容執行一次,直播內容則可能會執行多次。以下程式碼片段說明應用程式在載入資訊清單時可執行的操作。

Kotlin

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

Java

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 提供多種方式,讓您依據應用程式需求調整播放體驗。如需範例,請參閱自訂頁面