Oynatma listeleri

Oynatma listesi API'si, Player arayüzü tarafından tanımlanır ve tüm ExoPlayer uygulamaları Oynatma listeleri, birden fazla parçanın ardışık olarak oynatılmasını sağlar. medya öğeleri. Aşağıdaki örnekte bir oynatma listesinin oynatılmasının nasıl başlatılacağı gösterilmektedir iki video içeren:

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();

Oynatma listesindeki öğeler arasındaki geçişler sorunsuzdur. Herhangi bir şart yoktur. aynı biçimde olmalıdırlar (örneğin, bir oynatma listesinde H264 ve VP9 videoları). Bunlar farklı türlerde bile olabilir (yani, oynatma listesi oluşturmayı da seçebilirsiniz. URL parametrelerinin Google tarafından nasıl ele alınmasını istediğinizi belirtmek için aynı MediaItem öğesini bir oynatma listesinde birden çok kez gösterir.

Oynatma listesini değiştirme

Oynatma listelerini ekleyerek, taşıyarak, kaldırarak veya değiştirerek dinamik olarak değiştirebilirsiniz. medya öğeleri. Bu işlem, oynatma öncesinde ve sırasında ilgili oynatma listesi API yöntemleri:

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));

Oynatma listesinin tamamını değiştirme ve temizleme de desteklenir:

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();

Oynatıcı, oynatma sırasında değişiklikleri otomatik olarak doğru yol:

  • Şu anda oynatılan MediaItem taşınırsa oynatma kesintiye uğramaz oyunun yeni devamı tamamlandığında oynanacak.
  • Şu anda oynatılan MediaItem kaldırılırsa oynatıcı otomatik olarak kalan ilkini oynatma veya yoksa sona erme durumuna geçiş yapma var demektir.
  • Şu anda oynatılan MediaItem değiştirilirse oynatma kesintiye uğramaz MediaItem içindeki özelliklerin hiçbiri oynatmayla alakalı değilse değiştirildi. Örneğin, MediaItem.MediaMetadata alanda değişiklik yapmayın.

Oynatma listesini sorgulama

Oynatma listesi, Player.getMediaItemCount ve Player.getMediaItemAt. Şu anda oynatılan medya öğesi sorgulanabilir Player.getCurrentMediaItem numaralı telefonu arayarak. Ayrıca, satış ve pazarlama Player.hasNextMediaItem veya Player.getNextMediaItemIndex gibi yöntemleri kullanarak oynatma listesinde gezinmeyi kolaylaştırır.

Tekrar modu

Oynatıcı, istediğiniz zaman Player.setRepeatMode:

  • Player.REPEAT_MODE_OFF: Oynatma listesi tekrarlanmaz ve oynatıcı oynatma listesindeki son öğe olduğunda Player.STATE_ENDED öğesine geçiş oynandı.
  • Player.REPEAT_MODE_ONE: Geçerli öğe sonsuz bir döngüde tekrarlanıyor. Player.seekToNextMediaItem gibi yöntemler bunu yoksayar ve daha sonra sonsuz bir döngüde tekrarlanacaktır.
  • Player.REPEAT_MODE_ALL: Oynatma listesinin tamamı sonsuz bir döngüde tekrarlanır.

Karıştırma modu

Karıştırma modu, istediğiniz zaman Player.setShuffleModeEnabled Karışık moddayken oynatıcı, oynatma listesini önceden hesaplanmış, rastgele bir sırada gösterir. Tüm öğeler bir kez çalınacak ve tekrarlamak için karıştır modu Player.REPEAT_MODE_ALL ile de birleştirilebilir sonsuz bir döngü içinde aynı rastgele sırayı alır. Karıştırma modu kapatıldığında oynatma, geçerli öğeden şu anki orijinal konumunda devam eder oynatma listesi.

Bu dizinlerin, Player.getCurrentMediaItemIndex her zaman orijinal, karıştırılmamış olarak gösterilir sipariş. Benzer şekilde, Player.seekToNextMediaItem öğeyi şurada oynatmaz: player.getCurrentMediaItemIndex() + 1 ancak karıştırma sırası. Oynatma listesine yeni öğe eklemek veya öğeleri kaldırmak mevcut karıştırılmış sıralama mümkün olduğunca aynı değildir.

Özel karıştırma sırası ayarlama

Oynatıcı, varsayılan olarak DefaultShuffleOrder kullanılarak karıştırmayı destekler. Bu, özel bir karıştırma sırası uygulaması sağlanarak veya DefaultShuffleOrder oluşturucuda özel bir sıra ayarlayarak:

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);

Oynatma listesi öğelerini tanımlama

Oynatma listesi öğelerini tanımlamak için MediaItem.mediaId, öğe:

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();

Bir uygulama, bir medya öğesi için medya kimliğini açıkça tanımlamazsa dize kullanılır.

Uygulama verilerini oynatma listesi öğeleriyle ilişkilendirme

Her medya öğesi, kimliğin yanı sıra özel bir etiketle de yapılandırılabilir. Bu, uygulama tarafından sağlanan herhangi bir nesne olabilir. Özel etiketlerin bir kullanımı meta veri ekleme işlemini yapabilirsiniz:

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();

Oynatmanın başka bir medya öğesine geçtiği durumları algılama

Oynatma işlemi başka bir medya öğesine geçtiğinde veya aynı öğeyi tekrarlamaya başladığında medya öğesi, Listener.onMediaItemTransition(MediaItem, @MediaItemTransitionReason) çağrılır. Bu geri çağırma yeni medyayı alır öğesi ile birlikte geçişin neden gerçekleştiğini belirten bir @MediaItemTransitionReason meydana geldi. onMediaItemTransition için yaygın bir kullanım alanı, uygulamanın yeni medya öğesi için kullanıcı arayüzü:

Kotlin

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

Java

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

Kullanıcı arayüzünü güncellemek için gereken meta veriler özel etiketlere ayarlanmışsa bir uygulama aşağıdaki gibi görünebilir:

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);
}

Oynatma listesinin değiştiğini algılama

Bir medya öğesi eklendiğinde, kaldırıldığında veya taşındığında Listener.onTimelineChanged(Timeline, @TimelineChangeReason) adı TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED ile hemen. Bu geri arama oyuncu henüz hazırlıklı olmadığında bile çağrılır.

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);
  }
}

Oynatma listesindeki bir medya öğesinin süresi gibi bilgiler olduğunda kullanılabilir, Timeline güncellenecek ve onTimelineChanged çağrılacak TIMELINE_CHANGE_REASON_SOURCE_UPDATE ile. Bir sorunun çözülmesine neden olabilecek zaman çizelgesi güncellemesi şunları içerir:

  • Uyarlanabilir medya öğesi hazırlandıktan sonra manifest'in kullanıma sunulması.
  • Canlı yayın oynatılırken düzenli olarak güncellenen bir manifest.