DASH

ExoPlayer は、複数のコンテナ形式の DASH をサポートしています。メディア ストリームは分離する必要があります。つまり、動画、音声、テキストは、DASH マニフェストの個別の AdaptationSet 要素で定義する必要があります(CEA-608 は、以下の表に示す例外です)。含まれている音声と動画のサンプル形式もサポートされている必要があります(詳細については、サンプル形式のセクションをご覧ください)。

機能 対応 コメント
コンテナ
FMP4 はい 分離ストリームのみ
WebM はい 分離ストリームのみ
マトロスカ はい 分離ストリームのみ
MPEG-TS × サポートの予定なし
字幕
TTML はい 未加工、または ISO/IEC 14496-30 に従った FMP4 への埋め込み
WebVTT はい 未加工、または ISO/IEC 14496-30 に従った FMP4 への埋め込み
CEA-608 はい SCTE ユーザー補助記述子を使用して通知された場合、FMP4 に埋め込まれる
CEA-708 はい SCTE ユーザー補助記述子を使用して通知された場合、FMP4 に埋め込まれる
メタデータ
EMSG メタデータ はい FMP4 に埋め込み
コンテンツの保護
Widevine はい 「cenc」スキーム: API 19 以降、「cbcs」スキーム: API 25 以降
PlayReady SL2000 はい Android TV、「cenc」スキームのみ
キーをクリア はい 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_MPDMediaItem.BuildersetMimeType に渡して、コンテンツのタイプを明示的に示すことができます。

ExoPlayer は、利用可能な帯域幅とデバイス機能の両方を考慮して、マニフェストで定義された表現を自動的に適応させます。

DashMediaSource の使用

その他のカスタマイズ オプションについては、MediaItem ではなく、DashMediaSource を作成してプレーヤーに直接渡すことができます。

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 コールバックが呼び出されます。これは、オンデマンド コンテンツで 1 回、ライブ コンテンツで何度も発生します。次のコード スニペットは、マニフェストが読み込まれたときにアプリがなんらかの処理を行う方法を示しています。

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 には、アプリのニーズに合わせて再生エクスペリエンスをカスタマイズするための複数の方法が用意されています。例については、カスタマイズのページをご覧ください。