Oynatma listeleri

Oynatma listesi API'si, tüm ExoPlayer uygulamaları tarafından uygulanan Player arayüzüyle tanımlanır. Oynatma listeleri, birden fazla medya öğesinin sırayla oynatılmasını sağlar. Aşağıdaki örnekte, iki video içeren bir oynatma listesinin nasıl oynatılacağı gösterilmektedir:

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ında sorunsuz geçiş yapılır. Aynı biçimde olmaları gerekmez (ör. bir oynatma listesi hem H264 hem de VP9 videoları içerebilir). Hatta farklı türlerde olabilirler (ör. bir oynatma listesi yalnızca videolar, resimler ve ses akışları içerebilir). Aynı MediaItem öğesini bir oynatma listesinde birden fazla kez kullanabilirsiniz.

Oynatma listesini değiştirme

Medya öğelerini ekleyerek, taşıyarak, kaldırarak veya değiştirerek oynatma listesini dinamik olarak değiştirebilirsiniz. Bu işlem, oynatma öncesinde ve sırasında ilgili oynatma listesi API yöntemleri çağrılarak yapılabilir:

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 yapılan değişiklikleri otomatik olarak doğru şekilde işler:

  • Şu anda oynatılan MediaItem taşınırsa oynatma kesintiye uğramaz ve tamamlandığında yeni halefi oynatılır.
  • Oynatılmakta olan MediaItem kaldırılırsa oynatıcı, kalan ilk halefi otomatik olarak oynatır veya böyle bir halef yoksa sona erdi durumuna geçer.
  • Şu anda oynatılan MediaItem değiştirilirse, oynatma ile ilgili MediaItem özelliklerinden hiçbiri değişmediği sürece oynatma kesintiye uğramaz. Örneğin, çoğu durumda oynatmayı etkilemeden MediaItem.MediaMetadata alanlarını güncellemek mümkündür.

Oynatma listesini sorgulama

Oynatma listesi, Player.getMediaItemCount ve Player.getMediaItemAt kullanılarak sorgulanabilir. Şu anda oynatılan medya öğesi, Player.getCurrentMediaItem çağrılarak sorgulanabilir. Oynatma listesinde gezinmeyi kolaylaştırmak için Player.hasNextMediaItem veya Player.getNextMediaItemIndex gibi başka kolaylık yöntemleri de vardır.

Tekrarlama modları

Oynatıcı, Player.setRepeatMode ile istediğiniz zaman ayarlayabileceğiniz 3 tekrar modunu destekler:

  • Player.REPEAT_MODE_OFF: Oynatma listesi tekrarlanmaz ve oynatma listesindeki son öğe oynatıldıktan sonra oynatıcı Player.STATE_ENDED'ye geçer.
  • Player.REPEAT_MODE_ONE: Geçerli öğe, sonsuz bir döngüde tekrarlanıyor. Player.seekToNextMediaItem gibi yöntemler bunu yoksayacak ve listedeki bir sonraki öğeyi arayacaktır. Bu öğe daha sonra sonsuz bir döngüde tekrarlanır.
  • Player.REPEAT_MODE_ALL: Oynatma listesinin tamamı sonsuz bir döngüde tekrarlanır.

Karıştırma modu

Karıştırma modu, Player.setShuffleModeEnabled simgesiyle istediğiniz zaman etkinleştirilebilir veya devre dışı bırakılabilir. Karıştırma modundayken oynatıcı, oynatma listesini önceden hesaplanmış rastgele bir sırayla çalar. Tüm öğeler bir kez çalınır ve karışık mod, aynı rastgele sırayı sonsuz bir döngüde tekrarlamak için Player.REPEAT_MODE_ALL ile de birleştirilebilir. Karıştırma modu devre dışı bırakıldığında oynatma, oynatma listesindeki mevcut öğeden orijinal konumunda devam eder.

Player.getCurrentMediaItemIndex gibi yöntemlerle döndürülen dizinlerin her zaman orijinal, karıştırılmamış sırayı ifade ettiğini unutmayın. Benzer şekilde, Player.seekToNextMediaItem, player.getCurrentMediaItemIndex() + 1 konumundaki öğeyi değil, karışık sıraya göre sonraki öğeyi oynatır. Şarkı listesine yeni öğeler eklemek veya öğeleri kaldırmak, mevcut karışık sırayı mümkün olduğunca değiştirmeden tutar.

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

Oynatıcı, varsayılan olarak DefaultShuffleOrder simgesini kullanarak karıştırmayı destekler. Bu, özel bir karıştırma sırası uygulaması sağlanarak veya DefaultShuffleOrder oluşturucusunda özel bir sıra ayarlanarak özelleştirilebilir:

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 belirleme

Oynatma listesi öğelerini tanımlamak için öğe oluşturulurken MediaItem.mediaId ayarlanabilir:

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, medya öğesi için medya kimliğini açıkça tanımlamıyorsa URI'nin dize gösterimi kullanılır.

Uygulama verilerini oynatma listesi öğeleriyle ilişkilendirme

Her medya öğesi, kimliğe ek olarak özel bir etiketle de yapılandırılabilir. Bu etiket, uygulama tarafından sağlanan herhangi bir nesne olabilir. Özel etiketlerin bir kullanım alanı, her medya öğesine meta veri eklemektir:

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

Oynatma başka bir medya öğesine geçtiğinde algılama

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

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 etiketler kullanılarak her medya öğesine eklenirse uygulama şu şekilde 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), TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED ile birlikte hemen çağrılır. Bu geri çağırma, oyuncu henüz hazırlanmamış olsa 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 kullanılabilir hale geldiğinde Timeline güncellenir ve onTimelineChanged, TIMELINE_CHANGE_REASON_SOURCE_UPDATE ile birlikte çağrılır. Zaman çizelgesi güncellemesine neden olabilecek diğer durumlar:

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