再生リスト API は MediaItem
インスタンスをベースとしており、MediaItem.Builder
を使用すると簡単に構築できます。プレーヤー内で、MediaItem
が MediaSource.Factory
によってプレイ可能な MediaSource
に変換されます。カスタム設定を使用しない場合、この変換は 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 を更新するのに役立ちます。
標準以外のファイル拡張子の処理
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
を適切に設定する必要があります。