ExoPlayer では、すべてのメディアが MediaItem で表されます。ただし、プレーヤーがコンテンツを再生するには、内部的に MediaSource インスタンスが必要です。プレーヤーは、MediaSource.Factory を使用してメディア アイテムからこれらを作成します。
デフォルトでは、プレーヤーは DefaultMediaSourceFactory を使用します。これにより、次のコンテンツ MediaSource 実装のインスタンスを作成できます。
DashMediaSource: DASH。SsMediaSource(SmoothStreaming の場合)。HlsMediaSource(HLS の場合)。ProgressiveMediaSource: 通常のメディア ファイル。RtspMediaSource: RTSP。
DefaultMediaSourceFactory は、対応するメディア アイテムのプロパティに応じて、より複雑なメディアソースを作成することもできます。これについては、メディア アイテムのページで詳しく説明しています。
プレーヤーのデフォルト構成でサポートされていないメディアソース設定が必要なアプリには、カスタマイズ用のオプションがいくつかあります。
メディアソースの作成をカスタマイズする
プレーヤーをビルドするときに、MediaSource.Factory を挿入できます。たとえば、アプリで広告を挿入し、CacheDataSource.Factory を使用してキャッシュをサポートする場合、これらの要件を満たすように DefaultMediaSourceFactory のインスタンスを構成し、プレーヤーの構築時に挿入できます。
Kotlin
val mediaSourceFactory: MediaSource.Factory = DefaultMediaSourceFactory(context) .setDataSourceFactory(cacheDataSourceFactory) .setLocalAdInsertionComponents(adsLoaderProvider, playerView) val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()
Java
MediaSource.Factory mediaSourceFactory = new DefaultMediaSourceFactory(context) .setDataSourceFactory(cacheDataSourceFactory) .setLocalAdInsertionComponents(adsLoaderProvider, /* adViewProvider= */ playerView); ExoPlayer player = new ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build();
使用可能なオプションの詳細については、DefaultMediaSourceFactory JavaDoc をご覧ください。
カスタムの MediaSource.Factory 実装を挿入することもできます。たとえば、カスタムのメディアソース タイプの作成をサポートする場合などです。プレイリストに追加されたメディア アイテムごとに、ファクトリの createMediaSource(MediaItem) が呼び出されてメディアソースが作成されます。
メディアソース ベースのプレイリスト API
ExoPlayer インターフェースは、メディア アイテムではなくメディアソースを受け入れる追加のプレイリスト メソッドを定義します。これにより、プレーヤーの内部 MediaSource.Factory をバイパスして、メディアソース インスタンスをプレーヤーに直接渡すことができます。
Kotlin
// Set a list of media sources as initial playlist. exoPlayer.setMediaSources(listOfMediaSources) // Add a single media source. exoPlayer.addMediaSource(anotherMediaSource) // Can be combined with the media item API. exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri)) exoPlayer.prepare() exoPlayer.play()
Java
// Set a list of media sources as initial playlist. exoPlayer.setMediaSources(listOfMediaSources); // Add a single media source. exoPlayer.addMediaSource(anotherMediaSource); // Can be combined with the media item API. exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri)); exoPlayer.prepare(); exoPlayer.play();
高度なメディアソースの構成
ExoPlayer には、他の MediaSource インスタンスを変更して作成するための複数の MediaSource 実装が用意されています。これは、複数のカスタマイズを組み合わせる必要があり、よりシンプルな設定パスでは不十分な場合に最も役立ちます。
ClippingMediaSource: 指定したタイムスタンプ範囲にメディアをクリップできます。これが唯一の変更である場合は、代わりにMediaItem.ClippingConfigurationを使用することをおすすめします。FilteringMediaSource: 利用可能なトラックを指定したタイプにフィルタします。たとえば、音声と動画の両方を含むファイルから動画トラックのみを公開します。この変更のみを行う場合は、代わりにトラック選択パラメータを使用することをおすすめします。MergingMediaSource: 複数のメディアソースを結合して並行して再生します。ほとんどの場合、adjustPeriodTimeOffsetsとclipDurationsを true に設定してコンストラクタを呼び出し、すべてのソースが同時に開始および終了するようにすることをおすすめします。この変更がサイドロードされた字幕を追加するために行われる場合は、代わりにMediaItem.SubtitleConfigurationを使用することをおすすめします。ConcatenatingMediaSource2: 複数のメディアソースを結合して連続再生します。ユーザーに表示されるメディア構造は、単一のTimeline.Windowを公開します。つまり、単一のアイテムのように見えます。この変更が、1 つのアイテムのように見えない複数のアイテムを再生するために行われる場合は、代わりにPlayer.addMediaItemなどのプレイリスト API メソッドを使用することをおすすめします。SilenceMediaSource: 指定された期間の無音を生成します。これは、ギャップを埋めるのに役立ちます。AdsMediaSource: クライアントサイド広告挿入機能を使用してメディアソースを拡張します。詳しくは、広告挿入ガイドをご覧ください。ServerSideAdInsertionMediaSource: サーバーサイド広告 挿入機能を使用してメディアソースを拡張します。詳しくは、広告挿入ガイドをご覧ください。