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) | いいえ | |
| IMA サーバーサイド広告とクライアントサイド広告 | ○ | 広告挿入ガイド |
| ライブ再生 | ||
| 通常のライブ再生 | はい | |
| 超低レイテンシの CMAF ライブ再生 | ○ | |
| 共通メディア クライアント データ (CMCD) | ○ | CMCD 統合ガイド |
MediaItem の使用
DASH ストリームを再生するには、DASH モジュールに依存する必要があります。
Kotlin
implementation("androidx.media3:media3-exoplayer-dash:1.11.1")
Groovy
implementation "androidx.media3:media3-exoplayer-dash:1.11.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.Builder の setMimeType に渡して、コンテンツのタイプを明示的に示すことができます。
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.Listener の onTimelineChanged コールバックは、マニフェストが読み込まれるたびに呼び出されます。これは、オンデマンド コンテンツの場合は 1 回、ライブ コンテンツの場合は複数回発生する可能性があります。次のコード スニペットは、マニフェストが読み込まれるたびにアプリが処理を行う方法を示しています。
Kotlin
player.addListener( object : Player.Listener { override fun onTimelineChanged( timeline: Timeline, @Player.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 には、アプリのニーズに合わせて再生エクスペリエンスをカスタマイズする方法が複数用意されています。例については、カスタマイズ ページをご覧ください。