Oynatma listeleri

Oynatma listesi API'si, tüm ExoPlayer uygulamaları tarafından uygulanan Player arayüzü tarafından tanımlanır. Oynatma listeleri, birden fazla medya öğesinin sıralı olarak oynatılmasını sağlar. Aşağıdaki örnekte, iki video içeren bir oynatma listesinin nasıl oynatılmaya başlanacağı 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 geçişler sorunsuzdur. Aynı biçimde olmaları gerekmez (örneğin, bir oynatma listesinin hem H264 hem de VP9 videoları içermesi sorun değildir). Farklı türlerde bile olabilirler. Yani, oynatma listesinin hem video hem de yalnızca ses akışı içermesi sorun yaratmaz. Bir oynatma listesinde aynı MediaItem öğesini birden fazla kez kullanabilirsiniz.

Oynatma listesini değiştirme

Medya öğelerini ekleyerek, taşıyarak, kaldırarak veya değiştirerek oynatma listelerini dinamik olarak değiştirebilirsiniz. Bu işlem, ilgili oynatma listesi API'si yöntemlerini çağırarak hem oynatmadan önce hem de oynatma sırasında 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 takipçisi çalınır.
  • Şu anda oynatılan MediaItem kaldırılırsa oynatıcı, kalan ilk takipçiyi otomatik olarak oynatır veya böyle bir halef yoksa sona ermiş duruma geçer.
  • Şu anda oynatılan MediaItem değiştirilirse MediaItem içindeki oynatmayla ilgili özelliklerden hiçbiri değişmezse oynatma kesintiye uğramaz. Örneğin, çoğu durumda MediaItem.MediaMetadata alanlarını, oynatmayı etkilemeden 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ısı yapı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ı, dilediğiniz zaman Player.setRepeatMode ile ayarlanabilen 3 tekrar modunu destekler:

  • Player.REPEAT_MODE_OFF: Oynatma listesi tekrarlanmaz ve oynatma listesindeki son öğe çalındıktan sonra oynatıcı Player.STATE_ENDED moduna geçer.
  • Player.REPEAT_MODE_ONE: Geçerli öğe, sonsuz bir döngüde tekrarlanıyor. Player.seekToNextMediaItem gibi yöntemler bunu yoksayar ve listedeki bir sonraki öğeyi arar. Bu daha sonra, sonsuz bir döngü içinde tekrarlanır.
  • Player.REPEAT_MODE_ALL: Oynatma listesinin tamamı sonsuz bir döngü halinde tekrarlanır.

Karıştırma modu

Karıştırma modunu Player.setShuffleModeEnabled ile dilediğiniz zaman etkinleştirebilir veya devre dışı bırakabilirsiniz. Karıştırma modundayken oynatıcı, şarkı listesini önceden hesaplanmış, rastgele bir sırayla oynatır. Tüm öğeler bir kez çalınır ve aynı rastgele sıralamayı sonsuz bir döngü içinde tekrarlamak için karıştırma modu Player.REPEAT_MODE_ALL ile birleştirilebilir. Karıştırma modu kapatıldığında oynatma, mevcut öğeden oynatma listesindeki orijinal konumundan 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 öğeyi player.getCurrentMediaItemIndex() + 1 konumunda değil, karıştırma sırasına göre sonraki öğeyi oynatır. Oynatma listesine yeni öğeler eklemek veya öğe kaldırmak, karıştırılan mevcut sıralamanın mümkün olduğunca değişmeden kalmasını sağlar.

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

Varsayılan olarak, oynatıcı DefaultShuffleOrder kullanarak karıştırmayı destekler. Bu, özel bir karıştırma sırası uygulaması sağlayarak veya DefaultShuffleOrder oluşturucuda özel bir sipariş ayarlayarak ö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 tanımlama

Oynatma listesi öğelerini tanımlamak için MediaItem.mediaId, öğe oluşturulurken 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 açıkça bir medya kimliği tanımlamazsa URI'nın 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ı, her bir 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 tekrarlamaya başladığında Listener.onMediaItemTransition(MediaItem, @MediaItemTransitionReason) çağrılır. Bu geri çağırma, yeni medya öğesini ve geçişin neden gerçekleştiğini belirten @MediaItemTransitionReason bilgisini alır. onMediaItemTransition için yaygın bir kullanım alanı, uygulamanın kullanıcı arayüzünü yeni medya öğesi için güncellemektir:

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 bir medya öğesine eklenirse 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 listesi değiştiğinde 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 hemen çağrılır. Bu geri çağırma, oynatıcı 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 olduğunda Timeline güncellenir ve onTimelineChanged, TIMELINE_CHANGE_REASON_SOURCE_UPDATE ile çağrılır. Zaman çizelgesi güncellemesine yol açabilecek diğer nedenler şunlardır:

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