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」スキームのみ
広告挿入
複数期間の再生
サーバーガイド付き広告挿入 (xlinks) NO
IMA サーバーサイド広告とクライアントサイド広告 広告挿入ガイド
ライブ再生
通常のライブ再生
超低遅延 CMAF ライブ再生
共通メディア クライアント データ (CMCD) 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 で終わらない場合は、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 には、アプリのニーズに合わせて再生エクスペリエンスを調整するための複数の方法が用意されています。例については、カスタマイズ ページをご覧ください。