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などのプレイリスト API メソッドを使用することをおすすめします。SilenceMediaSource: 指定された期間の無音状態を生成します。これは、ギャップを埋めるのに役立ちます。AdsMediaSource: クライアントサイドの広告挿入機能でメディアソースを拡張します。詳しくは、広告挿入ガイドをご覧ください。ServerSideAdInsertionMediaSource: サーバーサイド広告挿入機能でメディアソースを拡張します。詳しくは、広告挿入ガイドをご覧ください。