メディア移行元

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