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ştirilirseMediaItem
içindeki oynatmayla ilgili özelliklerden hiçbiri değişmezse oynatma kesintiye uğramaz. Örneğin, çoğu durumdaMediaItem.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.