ExoPlayer では、メディアのすべての部分が MediaItem
で表されます。ただし、内部的には、プレーヤーがコンテンツを再生するためには MediaSource
インスタンスが必要です。プレーヤーは MediaSource.Factory
を使用してメディア アイテムからこれらを作成します。
デフォルトでは、プレーヤーは DefaultMediaSourceFactory
を使用します。これにより、次のコンテンツの MediaSource
実装のインスタンスを作成できます。
- DASH の場合は
DashMediaSource
。 - SmoothStreaming の場合、
SsMediaSource
。 - HLS:
HlsMediaSource
。 - 通常のメディア ファイルの場合は
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
: 複数のメディアソースを統合して、連続して再生します。ユーザーに表示されるメディア構造では、1 つのTimeline.Window
が公開されます。つまり、1 つのアイテムのように見えます。この変更により、1 つに見えないはずのアイテムを複数再生する場合は、Player.addMediaItem
のような playlist API メソッドを使用することをおすすめします。SilenceMediaSource
: ギャップを埋めるのに役立つ、指定された時間の間無音を生成します。AdsMediaSource
: クライアントサイドの広告挿入機能を使用してメディアソースを拡張します。詳しくは、広告挿入ガイドをご覧ください。ServerSideAdInsertionMediaSource
: サーバーサイドの広告挿入機能を使用してメディアソースを拡張します。詳しくは、広告挿入ガイドをご覧ください。