メディア項目

プレイリスト APIMediaItem インスタンスに基づいており、MediaItem.Builder を使用して簡単に構築できます。プレーヤー内部では、MediaItemMediaSource.Factory によって再生可能な MediaSource に変換されます。カスタム構成がない場合、この変換は DefaultMediaSourceFactory によって実行されます。この DefaultMediaSourceFactory は、メディア アイテムのプロパティに対応する複雑なメディアソースを構築できます。メディア アイテムに設定できるプロパティの一部を以下に示します。

シンプルなメディア アイテム

ストリーム URI のみで構成されるメディア アイテムは、fromUri 便利なメソッドで作成できます。

Kotlin

val mediaItem = MediaItem.fromUri(videoUri)

Java

MediaItem mediaItem = MediaItem.fromUri(videoUri);

その他のすべてのケースでは、MediaItem.Builder を使用できます。次の例では、ID といくつかの添付メタデータを使用してメディア アイテムをビルドしています。

Kotlin

val mediaItem =
  MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build()

Java

MediaItem mediaItem =
    new MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build();

メタデータを添付すると、プレイリストの切り替え時にアプリの UI を更新するのに役立ちます。

画像

画像の再生には、メディア アイテムの再生中に画像を表示する時間を指定する再生時間が必要です。モーション フォト画像読み込みライブラリ(Glide など)について詳しくは、画像のガイドページをご覧ください。

Kotlin

val mediaItem = MediaItem.Builder().setUri(imageUri).setImageDurationMs(3000).build()

Java

MediaItem mediaItem =
    new MediaItem.Builder().setUri(imageUri).setImageDurationMs(3_000).build();

アダプティブ メディアの標準以外のファイル拡張子

ExoPlayer は、DASH、HLS、SmoothStreaming 用のアダプティブ メディアソースを提供します。このようなアダプティブ メディア アイテムの URI が標準のファイル拡張子で終わる場合、対応するメディアソースが自動的に作成されます。URI に標準以外の拡張子がある場合や、拡張子がない場合は、メディア アイテムのタイプを示すために MIME タイプを明示的に設定できます。

Kotlin

val mediaItem =
  MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build()

Java

MediaItem mediaItem =
    new MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build();

プログレッシブ メディア ストリームの場合、MIME タイプは必須ではありません。

保護されたコンテンツ

保護されたコンテンツの場合、メディア アイテムの DRM プロパティを設定する必要があります。UUID は必須ですが、他のプロパティはすべて省略可能です。

ライセンス URI がメディア(DASH プレイリストなど)で直接利用できず、複数のセッションが必要な(キーローテーションなどによる)Widevine DRM で保護されたアイテムを再生するための構成の例:

Kotlin

val mediaItem =
  MediaItem.Builder()
    .setUri(videoUri)
    .setDrmConfiguration(
      MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
        .setLicenseUri(licenseUri)
        .setMultiSession(true)
        .setLicenseRequestHeaders(httpRequestHeaders)
        .build()
    )
    .build()

Java

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setDrmConfiguration(
            new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
                .setLicenseUri(licenseUri)
                .setMultiSession(true)
                .setLicenseRequestHeaders(httpRequestHeaders)
                .build())
        .build();

プレーヤー内で、DefaultMediaSourceFactory はこれらのプロパティを DrmSessionManagerProvider に渡し、DrmSessionManager を取得します。この DrmSessionManager は、作成された MediaSource に挿入されます。DRM の動作は、ニーズに合わせてさらにカスタマイズできます。

字幕トラックのサイドローディング

字幕トラックをサイドロードするには、メディア アイテムのビルド時に MediaItem.Subtitle インスタンスを追加できます。

Kotlin

val subtitle =
  MediaItem.SubtitleConfiguration.Builder(subtitleUri)
    .setMimeType(mimeType) // The correct MIME type (required).
    .setLanguage(language) // The subtitle language (optional).
    .setSelectionFlags(selectionFlags) // Selection flags for the track (optional).
    .build()
val mediaItem =
  MediaItem.Builder().setUri(videoUri).setSubtitleConfigurations(listOf(subtitle)).build()

Java

MediaItem.SubtitleConfiguration subtitle =
    new MediaItem.SubtitleConfiguration.Builder(subtitleUri)
        .setMimeType(mimeType) // The correct MIME type (required).
        .setLanguage(language) // The subtitle language (optional).
        .setSelectionFlags(selectionFlags) // Selection flags for the track (optional).
        .build();
MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setSubtitleConfigurations(ImmutableList.of(subtitle))
        .build();

内部的には、DefaultMediaSourceFactoryMergingMediaSource を使用して、コンテンツ メディアソースと各字幕トラックの SingleSampleMediaSource を結合します。DefaultMediaSourceFactory は、マルチピリオド DASH の字幕のサイドローディングをサポートしていません。

メディア ストリームのクリッピング

メディア アイテムで参照されるコンテンツをクリップするには、カスタムの開始位置と終了位置を設定します。

Kotlin

val mediaItem =
  MediaItem.Builder()
    .setUri(videoUri)
    .setClippingConfiguration(
      MediaItem.ClippingConfiguration.Builder()
        .setStartPositionMs(startPositionMs)
        .setEndPositionMs(endPositionMs)
        .build()
    )
    .build()

Java

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setClippingConfiguration(
            new ClippingConfiguration.Builder()
                .setStartPositionMs(startPositionMs)
                .setEndPositionMs(endPositionMs)
                .build())
        .build();

内部的には、DefaultMediaSourceFactoryClippingMediaSource を使用してコンテンツ メディアソースをラップします。クリッピング プロパティは他にもあります。詳しくは、MediaItem.Builder Javadoc をご覧ください。

広告の挿入

広告を挿入するには、メディア アイテムの広告タグ URI プロパティを設定する必要があります。

Kotlin

val mediaItem =
  MediaItem.Builder()
    .setUri(videoUri)
    .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build())
    .build()

Java

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build())
        .build();

内部的には、DefaultMediaSourceFactory はコンテンツ メディアソースを AdsMediaSource でラップし、広告タグで定義された広告を挿入します。この機能を動作させるには、プレーヤーの DefaultMediaSourceFactory適切に設定する必要があります。