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 yeniMediaItem
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ı etkilemedenMediaItem.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ığındaPlayer.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.