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 に埋め込まれる
メタデータ
EMSG メタデータ はい FMP4 に埋め込まれている
コンテンツの保護
Widevine はい "cenc" スキーム: API 19 以降、"cbcs" スキーム: API 25 以降
PlayReady SL2000 はい Android TV、「cenc」スキームのみ
ClearKey はい API 21 以降、「cenc」スキームのみ
ライブ再生
通常のライブ再生 はい
超低レイテンシの CMAF ライブ再生 はい
Common Media Client Data(CMCD) はい 統合ガイド

MediaItem の使用

DASH ストリームを再生するには、DASH モジュールに依存する必要があります。

Kotlin

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

Groovy

implementation "androidx.media3:media3-exoplayer-dash:1.4.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 で終わらない場合は、MediaItem.BuildersetMimeTypeMimeTypes.APPLICATION_MPD を渡して、コンテンツのタイプを明示的に指定できます。

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 コールバックも呼び出されます。この処理はオンデマンド コンテンツで 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 には、アプリのニーズに合わせて再生エクスペリエンスを調整するための複数の方法が用意されています。例については、カスタマイズページをご覧ください。