DASH

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

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

使用 MediaItem

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

Kotlin

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

Groovy

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

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