プレイリスト

再生リスト API は、Player インターフェースによって定義されます。このインターフェースは、 すべての ExoPlayer の実装。プレイリストを使用すると、複数の動画を連続再生できる できます。次の例は、再生リストの再生を開始する方法を示しています。 2 つの動画を含む:

Kotlin

// Build the media items.
val firstItem = MediaItem.fromUri(firstVideoUri)
val secondItem = MediaItem.fromUri(secondVideoUri)
// Add the media items to be played.
player.addMediaItem(firstItem)
player.addMediaItem(secondItem)
// Prepare the player.
player.prepare()
// Start the playback.
player.play()

Java

// Build the media items.
MediaItem firstItem = MediaItem.fromUri(firstVideoUri);
MediaItem secondItem = MediaItem.fromUri(secondVideoUri);
// Add the media items to be played.
player.addMediaItem(firstItem);
player.addMediaItem(secondItem);
// Prepare the player.
player.prepare();
// Start the playback.
player.play();

再生リスト内のアイテム間の遷移がシームレスです。要件がない 同じ形式であること(たとえば、再生リストに両方を含めても問題ない) H264 動画と VP9 動画など)。異なる種類のデータがある場合もあります(つまり、 プレイリストに動画、画像、音声のみのストリームを含めます)。こちらの 再生リスト内で同じ MediaItem が複数回行われています。

再生リストを変更する

再生リストは、追加、移動、削除、置換によって動的に変更できます。 できます。これは、再生前と再生中の両方で、 対応する再生リスト API メソッド:

Kotlin

// Adds a media item at position 1 in the playlist.
player.addMediaItem(/* index= */ 1, MediaItem.fromUri(thirdUri))
// Moves the third media item from position 2 to the start of the playlist.
player.moveMediaItem(/* currentIndex= */ 2, /* newIndex= */ 0)
// Removes the first item from the playlist.
player.removeMediaItem(/* index= */ 0)
// Replace the second item in the playlist.
player.replaceMediaItem(/* index= */ 1, MediaItem.fromUri(newUri))

Java

// Adds a media item at position 1 in the playlist.
player.addMediaItem(/* index= */ 1, MediaItem.fromUri(thirdUri));
// Moves the third media item from position 2 to the start of the playlist.
player.moveMediaItem(/* currentIndex= */ 2, /* newIndex= */ 0);
// Removes the first item from the playlist.
player.removeMediaItem(/* index= */ 0);
// Replace the second item in the playlist.
player.replaceMediaItem(/* index= */ 1, MediaItem.fromUri(newUri));

プレイリスト全体の置換とクリアもサポートされています。

Kotlin

// Replaces the playlist with a new one.
val newItems: List<MediaItem> = listOf(MediaItem.fromUri(fourthUri), MediaItem.fromUri(fifthUri))
player.setMediaItems(newItems, /* resetPosition= */ true)
// Clears the playlist. If prepared, the player transitions to the ended state.
player.clearMediaItems()

Java

// Replaces the playlist with a new one.
ImmutableList<MediaItem> newItems =
    ImmutableList.of(MediaItem.fromUri(fourthUri), MediaItem.fromUri(fifthUri));
player.setMediaItems(newItems, /* resetPosition= */ true);
// Clears the playlist. If prepared, the player transitions to the ended state.
player.clearMediaItems();

プレーヤーは、再生中の変更を正しい場所で自動的に処理します。 方法:

  • 現在再生中の MediaItem が移動されても、再生は中断されず、 その新しい後継が再生完了時に再生されます。
  • 現在再生中の MediaItem を削除すると、プレーヤーは自動的に 最初の残りの後続が再生され、そうでない場合は終了状態に移行します。 後継者が存在することになります。
  • 現在再生中の MediaItem が置き換えられても、再生は中断されません MediaItem に再生に関連するプロパティがない場合 変更されました。たとえば、次のように MediaItem.MediaMetadata を更新できます。 フィールドです。ほとんどの場合、再生には影響しません。

再生リストのクエリ

再生リストは、Player.getMediaItemCount を使用してクエリできます。 Player.getMediaItemAt。現在再生中のメディア アイテムをクエリできる Player.getCurrentMediaItem を呼び出します。他にも、便利な機能が Player.hasNextMediaItemPlayer.getNextMediaItemIndex などのメソッドを使用して、 簡単に操作できます

繰り返しモード

プレーヤーは 3 つのリピートモードをサポートしており、これらはいつでも設定できます。 Player.setRepeatMode:

  • Player.REPEAT_MODE_OFF: 再生リストは繰り返し再生されず、プレーヤーは続きます。 再生リストの最後のアイテムが再生されると、Player.STATE_ENDED に移行する 確認できます。
  • Player.REPEAT_MODE_ONE: 現在の項目が無限ループに繰り返されている。 Player.seekToNextMediaItem などのメソッドはこれを無視し、指定された位置までシークします。 リスト内の次のアイテムが無限ループに繰り返されます。
  • Player.REPEAT_MODE_ALL: 再生リスト全体が無限ループで繰り返されます。

シャッフル モード

シャッフル モードの有効 / 無効はいつでも Player.setShuffleModeEnabled。シャッフル モードでは、プレーヤーは 計算済みのランダム化した順番に並べられます。すべてのアイテムが 1 回再生され、 シャッフル モードを Player.REPEAT_MODE_ALL と組み合わせて 同じランダムな順序でループに入ります。シャッフルモードをオフにすると 現在の項目から おすすめします。

次のメソッドから返されるインデックスは、 Player.getCurrentMediaItemIndex は常に、シャッフルされていない元のデータを参照します。 できます。同様に、Player.seekToNextMediaItem では、次の場所でアイテムは再生されません。 player.getCurrentMediaItemIndex() + 1 ですが、 シャッフル順序。再生リストに新しいアイテムを挿入したり、アイテムを削除しても、 既存のシャッフルされた順序は できるだけ変更されません

カスタム シャッフル順序の設定

デフォルトでは、プレーヤーは DefaultShuffleOrder を使用してシャッフルをサポートしています。 これは、カスタム シャッフル順序実装を提供するか、または次の方法でカスタマイズできます。 DefaultShuffleOrder コンストラクタでカスタム オーダーを設定する場合:

Kotlin

// Set a custom shuffle order for the 5 items currently in the playlist:
exoPlayer.setShuffleOrder(DefaultShuffleOrder(intArrayOf(3, 1, 0, 4, 2), randomSeed))
// Enable shuffle mode.
exoPlayer.shuffleModeEnabled = true

Java

// Set a custom shuffle order for the 5 items currently in the playlist:
exoPlayer.setShuffleOrder(new DefaultShuffleOrder(new int[] {3, 1, 0, 4, 2}, randomSeed));
// Enable shuffle mode.
exoPlayer.setShuffleModeEnabled(/* shuffleModeEnabled= */ true);

再生リストのアイテムを識別する

プレイリストのアイテムを識別するには、MediaItem.mediaId を item:

Kotlin

// Build a media item with a media ID.
val mediaItem = MediaItem.Builder().setUri(uri).setMediaId(mediaId).build()

Java

// Build a media item with a media ID.
MediaItem mediaItem = new MediaItem.Builder().setUri(uri).setMediaId(mediaId).build();

アプリでメディア アイテムのメディア ID が明示的に定義されていない場合、 表現を使用します。

アプリデータとプレイリスト アイテムの関連付け

ID だけでなく、各メディア アイテムにカスタムタグを設定することもできます。 これにはアプリが提供する 任意のオブジェクトを指定できますカスタムタグの用途の 1 つは 各メディア アイテムにメタデータを追加します。

Kotlin

// Build a media item with a custom tag.
val mediaItem = MediaItem.Builder().setUri(uri).setTag(metadata).build()

Java

// Build a media item with a custom tag.
MediaItem mediaItem = new MediaItem.Builder().setUri(uri).setTag(metadata).build();

再生が別のメディア アイテムに遷移するタイミングを検出する

再生が別のメディア アイテムに切り替わったとき、または同じメディア アイテムの繰り返しが開始されたとき メディア アイテムの場合、Listener.onMediaItemTransition(MediaItem, @MediaItemTransitionReason) が呼び出されます。このコールバックは、新しいメディアを受信します。 遷移の理由を示す @MediaItemTransitionReason とともに、 発生しました。onMediaItemTransition の一般的なユースケースは、 新しいメディア アイテム用のアプリの UI は次のようになります。

Kotlin

override fun onMediaItemTransition(
  mediaItem: MediaItem?,
  @MediaItemTransitionReason reason: Int,
) {
  updateUiForPlayingMediaItem(mediaItem)
}

Java

@Override
public void onMediaItemTransition(
    @Nullable MediaItem mediaItem, @MediaItemTransitionReason int reason) {
  updateUiForPlayingMediaItem(mediaItem);
}

UI の更新に必要なメタデータが、 実装は次のようになります。

Kotlin

override fun onMediaItemTransition(
  mediaItem: MediaItem?,
  @MediaItemTransitionReason reason: Int,
) {
  var metadata: CustomMetadata? = null
  mediaItem?.localConfiguration?.let { localConfiguration ->
    metadata = localConfiguration.tag as? CustomMetadata
  }
  updateUiForPlayingMediaItem(metadata)
}

Java

@Override
public void onMediaItemTransition(
    @Nullable MediaItem mediaItem, @MediaItemTransitionReason int reason) {
  @Nullable CustomMetadata metadata = null;
  if (mediaItem != null && mediaItem.localConfiguration != null) {
    metadata = (CustomMetadata) mediaItem.localConfiguration.tag;
  }
  updateUiForPlayingMediaItem(metadata);
}

再生リストの変更を検出する

メディア アイテムが追加、削除、移動されると、 Listener.onTimelineChanged(Timeline, @TimelineChangeReason) が呼び出されます TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED を使用します。このコールバックは、 プレーヤーの準備ができていない場合でも呼び出されます。

Kotlin

override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) {
  if (reason == Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED) {
    // Update the UI according to the modified playlist (add, move or remove).
    updateUiForPlaylist(timeline)
  }
}

Java

@Override
public void onTimelineChanged(Timeline timeline, @TimelineChangeReason int reason) {
  if (reason == TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED) {
    // Update the UI according to the modified playlist (add, move or remove).
    updateUiForPlaylist(timeline);
  }
}

再生リスト内のメディア アイテムの長さなどの情報が 使用可能になると、Timeline が更新され、onTimelineChanged が呼び出されます TIMELINE_CHANGE_REASON_SOURCE_UPDATE と一緒に使用できます。その他の原因により タイムラインの更新の内容:

  • アダプティブ メディア アイテムを準備した後にマニフェストが利用可能になる。
  • ライブ ストリームの再生中に定期的に更新されるマニフェスト。