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 Accessibility 記述子を使用して通知された場合は FMP4 に埋め込みます
CEA-708 はい SCTE Accessibility 記述子を使用して通知された場合は 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.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 を使用する

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