playlist API は MediaItem
インスタンスに基づいています。これは MediaItem.Builder
を使用して簡単に作成できます。プレーヤー内で、MediaItem
は MediaSource.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();
内部的には、DefaultMediaSourceFactory
は MergingMediaSource
を使用して、コンテンツ メディアソースを字幕トラックごとに 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();
内部では、DefaultMediaSourceFactory
は ClippingMediaSource
を使用してコンテンツ メディアソースをラップします。その他のクリッピング プロパティもあります。詳しくは、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
も適切に構成する必要があります。