再生リスト 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.hasNextMediaItem
や Player.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
と一緒に使用できます。その他の原因により
タイムラインの更新の内容:
- アダプティブ メディア アイテムを準備した後にマニフェストが利用可能になる。
- ライブ ストリームの再生中に定期的に更新されるマニフェスト。