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 つのアイテムのように見えます。この変更が、単一のアイテムのように見えない複数のアイテムを再生するために行われる場合、代わりにPlayer.addMediaItem
などの Playlist API メソッドを使用することをおすすめします。SilenceMediaSource
: 指定された時間の無音を生成します。ギャップを埋めるのに便利です。AdsMediaSource
: クライアントサイドの広告挿入機能を使用してメディアソースを拡張します。詳しくは、広告挿入ガイドをご覧ください。ServerSideAdInsertionMediaSource
: サーバーサイドの広告挿入機能でメディアソースを拡張します。詳しくは、広告挿入ガイドをご覧ください。