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ırayla oynatılmasını sağlar. Aşağıdaki örnekte, iki video içeren bir oynatma listesinin oynatılmasının nasıl başlatı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ındaki geçişler sorunsuzdur. Videoların aynı biçimde olması gerekmez (örneğin, bir oynatma listesinde hem H.264 hem de VP9 videoları bulunabilir). Bunlar farklı türlerde bile olabilir (yani bir oynatma listesinin video, resim ve yalnızca ses akışı içermesi sorun yaratmaz). Aynı MediaItem'yi bir oynatma listesinde birden çok kez kullanabilirsiniz.

Oynatma listesini değiştirme

Medya öğeleri ekleyerek, taşıyarak, kaldırarak veya değiştirerek oynatma listelerini dinamik olarak değiştirebilirsiniz. Bu işlem, ilgili oynatma listesi API yöntemleri çağrılarak hem oynatma öncesinde hem de 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 işlemleri 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 doğru şekilde otomatik olarak işler:

  • Şu anda oynatılan MediaItem taşınırsa oynatma kesintiye uğramaz ve tamamlandığında yeni MediaItem oynatılır.
  • Oynatılan MediaItem kaldırılırsa oynatıcı, kalan ilk ardılı otomatik olarak oynatır veya böyle bir ardılı yoksa bitiş durumuna geçer.
  • Şu anda oynatılan MediaItem değiştirilirse oynatma, MediaItem'deki oynatmayla ilgili özelliklerden hiçbiri değiştirilmediği sürece kesintiye uğramaz. Örneğin, çoğu durumda oynatmayı etkilemeden MediaItem.MediaMetadata alanlarını güncelleyebilirsiniz.

Oynatma listesini sorgulamak

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 listesindeki gezinmeyi kolaylaştırmak için Player.hasNextMediaItem veya Player.getNextMediaItemIndex gibi diğer kolaylık yöntemleri de vardır.

Tekrarlama modları

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

  • Player.REPEAT_MODE_OFF: Oynatma listesi tekrarlanmaz ve oynatıcı, oynatma listesindeki son öğe oynatıldığında Player.STATE_ENDED öğesine geçiş yapar.
  • Player.REPEAT_MODE_ONE: Geçerli öğe sonsuz bir döngüde tekrarlanır. Player.seekToNextMediaItem gibi yöntemler bunu yoksayar ve listedeki bir sonraki öğeye gider, bu da 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 ile dilediğiniz zaman etkinleştirilebilir veya devre dışı bırakılabilir. Karıştırma modundayken oynatıcı, oynatma listesini önceden hesaplanmış, rastgele bir sırada çalar. Tüm öğeler bir kez oynatılır ve karıştırma modu, aynı rastgele sırayı sonsuz bir döngüde tekrarlamak için Player.REPEAT_MODE_ALL ile de birleştirilebilir. Karıştırma modu kapatıldığında oynatma, oynatma listesindeki orijinal konumunda mevcut öğeden devam eder.

Player.getCurrentMediaItemIndex gibi yöntemler tarafından döndürülen dizinlerin her zaman orijinal, karıştırılmamış sıraya atıfta bulunduğunu unutmayın. Benzer şekilde, Player.seekToNextMediaItem, player.getCurrentMediaItemIndex() + 1'teki öğeyi değil, karıştırma sırasına göre bir sonraki öğeyi oynatır. Oynatma listesine yeni öğeler eklemek veya öğeleri kaldırmak, mevcut karıştırılmış sıralamanın mümkün olduğunca değişmeden kalmasını sağlar.

Ö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 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ımlamazsa URI'nin dize temsili 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 işleminin başka bir medya öğesine geçişini 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 bir @MediaItemTransitionReason 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 medya öğesine eklenirse uygulama şöyle 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 ne zaman 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, 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 hale geldiğinde Timeline güncellenir ve onTimelineChanged, TIMELINE_CHANGE_REASON_SOURCE_UPDATE ile çağrılır. Zaman çizelgesinin güncellenmesine neden olabilecek diğer nedenler şunlardır:

  • Uyarlanabilir medya öğesi hazırlandıktan sonra kullanıma sunulan bir manifest.
  • Canlı yayının oynatılması sırasında periyodik olarak güncellenen bir manifest.