Oynatma listesi API'si, Player
arayüzü tarafından tanımlanır ve
tüm ExoPlayer
uygulamaları Oynatma listeleri, birden fazla parçanın ardışık olarak oynatılmasını sağlar.
medya öğeleri. Aşağıdaki örnekte bir oynatma listesinin oynatılmasının nasıl başlatılacağı gösterilmektedir
iki video içeren:
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. Herhangi bir şart yoktur.
aynı biçimde olmalıdırlar (örneğin, bir oynatma listesinde
H264 ve VP9 videoları). Bunlar farklı türlerde bile olabilir (yani,
oynatma listesi oluşturmayı da seçebilirsiniz. URL parametrelerinin Google tarafından nasıl ele alınmasını istediğinizi belirtmek için
aynı MediaItem
öğesini bir oynatma listesinde birden çok kez gösterir.
Oynatma listesini değiştirme
Oynatma listelerini ekleyerek, taşıyarak, kaldırarak veya değiştirerek dinamik olarak değiştirebilirsiniz. medya öğeleri. Bu işlem, oynatma öncesinde ve sırasında ilgili oynatma listesi API yöntemleri:
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 değişiklikleri otomatik olarak doğru yol:
- Şu anda oynatılan
MediaItem
taşınırsa oynatma kesintiye uğramaz oyunun yeni devamı tamamlandığında oynanacak. - Şu anda oynatılan
MediaItem
kaldırılırsa oynatıcı otomatik olarak kalan ilkini oynatma veya yoksa sona erme durumuna geçiş yapma var demektir. - Şu anda oynatılan
MediaItem
değiştirilirse oynatma kesintiye uğramazMediaItem
içindeki özelliklerin hiçbiri oynatmayla alakalı değilse değiştirildi. Örneğin,MediaItem.MediaMetadata
alanda değişiklik yapmayın.
Oynatma listesini sorgulama
Oynatma listesi, Player.getMediaItemCount
ve
Player.getMediaItemAt
. Şu anda oynatılan medya öğesi sorgulanabilir
Player.getCurrentMediaItem
numaralı telefonu arayarak. Ayrıca, satış ve pazarlama
Player.hasNextMediaItem
veya Player.getNextMediaItemIndex
gibi yöntemleri kullanarak
oynatma listesinde gezinmeyi kolaylaştırır.
Tekrar modu
Oynatıcı, istediğiniz zaman
Player.setRepeatMode
:
Player.REPEAT_MODE_OFF
: Oynatma listesi tekrarlanmaz ve oynatıcı oynatma listesindeki son öğe olduğundaPlayer.STATE_ENDED
öğesine geçiş oynandı.Player.REPEAT_MODE_ONE
: Geçerli öğe sonsuz bir döngüde tekrarlanıyor.Player.seekToNextMediaItem
gibi yöntemler bunu yoksayar ve daha sonra sonsuz bir döngüde tekrarlanacaktır.Player.REPEAT_MODE_ALL
: Oynatma listesinin tamamı sonsuz bir döngüde tekrarlanır.
Karıştırma modu
Karıştırma modu, istediğiniz zaman
Player.setShuffleModeEnabled
Karışık moddayken oynatıcı,
oynatma listesini önceden hesaplanmış, rastgele bir sırada gösterir. Tüm öğeler bir kez çalınacak ve
tekrarlamak için karıştır modu Player.REPEAT_MODE_ALL
ile de birleştirilebilir
sonsuz bir döngüde aynı rastgele sırayı alır. Karıştırma modu kapatıldığında
oynatma, geçerli öğeden şu anki orijinal konumunda devam eder
oynatma listesi.
Bu dizinlerin,
Player.getCurrentMediaItemIndex
her zaman orijinal, karıştırılmamış olarak gösterilir
sipariş. Benzer şekilde, Player.seekToNextMediaItem
öğeyi şurada oynatmaz:
player.getCurrentMediaItemIndex() + 1
ancak
karıştırma sırası. Oynatma listesine yeni öğe eklemek veya öğeleri kaldırmak
mevcut karıştırılmış sıralama mümkün olduğunca aynı değildir.
Ö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 ayarlayarak:
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:
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, bir medya öğesi için medya kimliğini açıkça tanımlamazsa dize kullanılır.
Uygulama verilerini oynatma listesi öğeleriyle ilişkilendirme
Her medya öğesi, kimliğin yanı sıra özel bir etiketle de yapılandırılabilir. Bu, uygulama tarafından sağlanan herhangi bir nesne olabilir. Özel etiketlerin bir kullanımı meta veri ekleme işlemini yapabilirsiniz:
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();
Oynatmanın başka bir medya öğesine geçtiği durumları algılama
Oynatma işlemi başka bir medya öğesine geçtiğinde veya aynı öğeyi tekrarlamaya başladığında
medya öğesi, Listener.onMediaItemTransition(MediaItem,
@MediaItemTransitionReason)
çağrılır. Bu geri çağırma yeni medyayı alır
öğesi ile birlikte geçişin neden gerçekleştiğini belirten bir @MediaItemTransitionReason
meydana geldi. onMediaItemTransition
için yaygın bir kullanım alanı,
uygulamanın yeni medya öğesi için kullanıcı arayüzü:
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 etiketlere ayarlanmışsa bir 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 listesinin değiştiğini algılama
Bir medya öğesi eklendiğinde, kaldırıldığında veya taşındığında
Listener.onTimelineChanged(Timeline, @TimelineChangeReason)
adı
TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED
ile hemen. Bu geri arama
oyuncu henüz hazırlıklı olmadığında 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 olduğunda
kullanılabilir, Timeline
güncellenecek ve onTimelineChanged
çağrılacak
TIMELINE_CHANGE_REASON_SOURCE_UPDATE
ile. Bir sorunun çözülmesine neden olabilecek
zaman çizelgesi güncellemesi şunları içerir:
- Uyarlanabilir medya öğesi hazırlandıktan sonra manifest'in kullanıma sunulması.
- Canlı yayın oynatılırken düzenli olarak güncellenen bir manifest.