DASH

ExoPlayer 支援採用多種容器格式的 DASH。媒體串流必須採去式處理,也就是說,影片、音訊和文字必須在 DASH 資訊清單中的不同 AdaptationSet 元素中定義 (CEA-608 例外,如下表所述)。您也必須支援包含的音訊和影片樣本格式 (詳情請參閱範例格式一節)。

功能 有權限 留言
容器
FMP4 僅限 Demuxed 串流
WebM 僅限 Demuxed 串流
馬特洛 僅限 Demuxed 串流
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」配置
即時播放
定期直播
超低延遲 CMAF 即時播放
通用媒體客戶資料 (CMCD) 整合指南

使用 MediaItem

您必須依附於 DASH 模組,才能播放 DASH 串流。

Kotlin

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

Groovy

implementation "androidx.media3:media3-exoplayer-dash:1.3.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 提供多種方式,讓您根據應用程式的需求打造符合需求的播放體驗。請參閱自訂頁面中的範例。