メディア移行元

ExoPlayer では、メディアのすべての部分が MediaItem で表されます。ただし、内部的には、プレーヤーがコンテンツを再生するためには MediaSource インスタンスが必要です。プレーヤーは MediaSource.Factory を使用してメディア アイテムからこれらを作成します。

デフォルトでは、プレーヤーは DefaultMediaSourceFactory を使用します。これにより、次のコンテンツの MediaSource 実装のインスタンスを作成できます。

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: 複数のメディアソースを統合して同時に再生します。ほとんどの場合、すべてのソースの開始と終了が同時に行われるように、adjustPeriodTimeOffsetsclipDurations を true に設定してコンストラクタを呼び出すことをおすすめします。この変更によってサイドローディングの字幕を追加する場合は、MediaItem.SubtitleConfiguration を使用することをおすすめします。
  • ConcatenatingMediaSource2: 複数のメディアソースを統合して、連続して再生します。ユーザーに表示されるメディア構造では、1 つの Timeline.Window が公開されます。つまり、1 つのアイテムのように見えます。この変更により、1 つに見えないはずのアイテムを複数再生する場合は、Player.addMediaItem のような playlist API メソッドを使用することをおすすめします。
  • SilenceMediaSource: ギャップを埋めるのに役立つ、指定された時間の間無音を生成します。
  • AdsMediaSource: クライアントサイドの広告挿入機能を使用してメディアソースを拡張します。詳しくは、広告挿入ガイドをご覧ください。
  • ServerSideAdInsertionMediaSource: サーバーサイドの広告挿入機能を使用してメディアソースを拡張します。詳しくは、広告挿入ガイドをご覧ください。