メディア項目

playlist 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 は必須ですが、他のすべてのプロパティは省略可能です。

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

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 を取得し、作成された MediaSource に挿入します。DRM の動作は、ニーズに合わせてさらにカスタマイズできます。

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

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

Kotlin

val subtitle =
  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())

Java

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

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