प्लेलिस्ट एपीआई को Player इंटरफ़ेस से तय किया जाता है. इसे ExoPlayer के सभी वर्शन में लागू किया जाता है. प्लेलिस्ट की मदद से, एक के बाद एक कई मीडिया आइटम चलाए जा सकते हैं. यहां दिए गए उदाहरण में, दो वीडियो वाली किसी प्लेलिस्ट को चलाने का तरीका बताया गया है:
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();
प्लेलिस्ट में मौजूद आइटम के बीच ट्रांज़िशन आसानी से होता है. यह ज़रूरी नहीं है कि वे एक ही फ़ॉर्मैट में हों. उदाहरण के लिए, किसी प्लेलिस्ट में H264 और VP9, दोनों फ़ॉर्मैट के वीडियो शामिल किए जा सकते हैं. ये अलग-अलग तरह के भी हो सकते हैं. इसका मतलब है कि किसी प्लेलिस्ट में सिर्फ़ वीडियो, इमेज, और ऑडियो स्ट्रीम शामिल की जा सकती हैं. किसी प्लेलिस्ट में एक ही MediaItem को कई बार इस्तेमाल किया जा सकता है.
प्लेलिस्ट में बदलाव करना
मीडिया आइटम जोड़ने, हटाने, उनकी जगह बदलने या उन्हें बदलने से, प्लेलिस्ट में डाइनैमिक तरीके से बदलाव किया जा सकता है. प्लेबैक शुरू होने से पहले और उसके दौरान, दोनों ही स्थितियों में ऐसा किया जा सकता है. इसके लिए, प्लेलिस्ट के एपीआई के इन तरीकों का इस्तेमाल करें:
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));
पूरी प्लेलिस्ट को बदलने और मिटाने की सुविधा भी उपलब्ध है:
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();
प्लेबैक के दौरान, प्लेयर सही तरीके से बदलावों को अपने-आप मैनेज करता है:
- अगर मौजूदा समय में चल रहे
MediaItemको हटा दिया जाता है, तो उसे चलाने में कोई रुकावट नहीं आती. साथ ही, उसके खत्म होने के बाद, उसकी जगह पर नयाMediaItemचलाया जाएगा. - अगर मौजूदा समय में चल रहे
MediaItemको हटा दिया जाता है, तो प्लेयर अपने-आप पहले बचे हुए उत्तराधिकारी को चलाएगा. अगर ऐसा कोई उत्तराधिकारी मौजूद नहीं है, तो प्लेयर बंद हो जाएगा. - अगर अभी चल रहे
MediaItemको बदल दिया जाता है, तो चलाने में रुकावट नहीं आती. ऐसा तब होता है, जब चलाने के लिए ज़रूरीMediaItemमें मौजूद किसी भी प्रॉपर्टी में बदलाव न किया गया हो. उदाहरण के लिए, ज़्यादातर मामलों में, वीडियो चलाने पर कोई असर डाले बिनाMediaItem.MediaMetadataफ़ील्ड अपडेट किए जा सकते हैं.
प्लेलिस्ट के बारे में क्वेरी करना
प्लेलिस्ट के बारे में क्वेरी करने के लिए, Player.getMediaItemCount और Player.getMediaItemAt का इस्तेमाल किया जा सकता है. Player.getCurrentMediaItem को कॉल करके, अभी चल रहे मीडिया आइटम के बारे में पूछा जा सकता है. प्लेलिस्ट में आसानी से नेविगेट करने के लिए, Player.hasNextMediaItem या Player.getNextMediaItemIndex जैसे अन्य तरीके भी उपलब्ध हैं.
दोहराने के मोड
इस प्लेयर में, दोहराने के तीन मोड होते हैं. इन्हें Player.setRepeatMode की मदद से कभी भी सेट किया जा सकता है:
Player.REPEAT_MODE_OFF: प्लेलिस्ट को दोहराया नहीं जाता है. प्लेलिस्ट में मौजूद आखिरी आइटम के चलने के बाद, प्लेयरPlayer.STATE_ENDEDपर चला जाएगा.Player.REPEAT_MODE_ONE: मौजूदा आइटम को बार-बार चलाया जा रहा है.Player.seekToNextMediaItemजैसे तरीके इसे अनदेखा कर देंगे और सूची में मौजूद अगले आइटम को ढूंढने की कोशिश करेंगे. इसके बाद, यह प्रोसेस लगातार चलती रहेगी.Player.REPEAT_MODE_ALL: पूरी प्लेलिस्ट को लगातार लूप में चलाया जाता है.
शफ़ल मोड
Player.setShuffleModeEnabled की मदद से, शफ़ल मोड को किसी भी समय चालू या बंद किया जा सकता है. शफ़ल मोड में, प्लेयर पहले से तय किए गए क्रम में प्लेलिस्ट को रैंडम तरीके से चलाएगा. सभी आइटम एक बार चलाए जाएंगे. साथ ही, शफ़ल मोड को Player.REPEAT_MODE_ALL के साथ भी इस्तेमाल किया जा सकता है, ताकि आइटम को बार-बार उसी क्रम में चलाया जा सके. शफ़ल मोड बंद होने पर, प्लेलिस्ट में मौजूद मौजूदा आइटम को उसकी मूल जगह से चलाना जारी रखा जाता है.
ध्यान दें कि Player.getCurrentMediaItemIndex जैसे तरीकों से मिले इंडेक्स, हमेशा ओरिजनल और बिना शफ़ल किए गए क्रम के हिसाब से होते हैं. इसी तरह, Player.seekToNextMediaItem दबाने पर player.getCurrentMediaItemIndex() + 1 पर मौजूद आइटम नहीं चलेगा. इसके बजाय, शफ़ल किए गए क्रम के हिसाब से अगला आइटम चलेगा. प्लेलिस्ट में नए आइटम जोड़ने या आइटम हटाने पर, शफ़ल किए गए मौजूदा क्रम में ज़्यादा से ज़्यादा बदलाव नहीं किया जाएगा.
शफ़ल करने का कस्टम क्रम सेट करना
डिफ़ॉल्ट रूप से, प्लेयर में DefaultShuffleOrder का इस्तेमाल करके, गाने शफ़ल किए जा सकते हैं.
इसे अपनी पसंद के मुताबिक बनाया जा सकता है. इसके लिए, शफ़ल करने के क्रम को लागू करने का कस्टम तरीका उपलब्ध कराएं या DefaultShuffleOrder कंस्ट्रक्टर में कस्टम क्रम सेट करें:
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);
प्लेलिस्ट के आइटम की पहचान करना
प्लेलिस्ट आइटम की पहचान करने के लिए, आइटम बनाते समय MediaItem.mediaId को सेट किया जा सकता है:
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();
अगर कोई ऐप्लिकेशन, मीडिया आइटम के लिए मीडिया आईडी साफ़ तौर पर तय नहीं करता है, तो यूआरआई के स्ट्रिंग वर्शन का इस्तेमाल किया जाता है.
ऐप्लिकेशन के डेटा को प्लेलिस्ट के आइटम से जोड़ना
आईडी के अलावा, हर मीडिया आइटम को कस्टम टैग के साथ भी कॉन्फ़िगर किया जा सकता है. यह टैग, ऐप्लिकेशन की ओर से उपलब्ध कराया गया कोई भी ऑब्जेक्ट हो सकता है. कस्टम टैग का इस्तेमाल, हर मीडिया आइटम में मेटाडेटा अटैच करने के लिए किया जाता है:
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();
यह पता लगाना कि मीडिया चलाने की सुविधा, किसी दूसरे मीडिया आइटम पर कब स्विच होती है
जब मीडिया आइटम को बदलकर कोई दूसरा मीडिया आइटम चलाया जाता है या एक ही मीडिया आइटम को बार-बार चलाया जाता है, तब Listener.onMediaItemTransition(MediaItem,
@MediaItemTransitionReason) को कॉल किया जाता है. इस कॉलबैक को नया मीडिया आइटम मिलता है. साथ ही, @MediaItemTransitionReason मिलता है, जिससे पता चलता है कि ट्रांज़िशन क्यों हुआ. onMediaItemTransition का इस्तेमाल आम तौर पर, नए मीडिया आइटम के लिए ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) को अपडेट करने के लिए किया जाता है:
Kotlin
override fun onMediaItemTransition( mediaItem: MediaItem?, @MediaItemTransitionReason reason: Int, ) { updateUiForPlayingMediaItem(mediaItem) }
Java
@Override public void onMediaItemTransition( @Nullable MediaItem mediaItem, @MediaItemTransitionReason int reason) { updateUiForPlayingMediaItem(mediaItem); }
अगर यूज़र इंटरफ़ेस (यूआई) को अपडेट करने के लिए ज़रूरी मेटाडेटा, कस्टम टैग का इस्तेमाल करके हर मीडिया आइटम से अटैच किया जाता है, तो लागू करने का तरीका कुछ ऐसा हो सकता है:
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); }
यह कुकी, प्लेलिस्ट में बदलाव होने का पता लगाती है
जब किसी मीडिया आइटम को जोड़ा, हटाया या भेजा जाता है, तब Listener.onTimelineChanged(Timeline, @TimelineChangeReason) को TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED के साथ तुरंत कॉल किया जाता है. इस कॉलबैक को तब भी कॉल किया जाता है, जब प्लेयर को अभी तक तैयार नहीं किया गया है.
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); } }
जब प्लेलिस्ट में मौजूद किसी मीडिया आइटम की अवधि जैसी जानकारी उपलब्ध हो जाती है, तब Timeline अपडेट हो जाएगा. साथ ही, onTimelineChanged को TIMELINE_CHANGE_REASON_SOURCE_UPDATE के साथ कॉल किया जाएगा. टाइमलाइन अपडेट होने की अन्य वजहें:
- अनुकूलित मीडिया आइटम तैयार करने के बाद, मेनिफ़ेस्ट उपलब्ध हो जाता है.
- यह एक ऐसा मेनिफ़ेस्ट होता है जिसे लाइव स्ट्रीम के दौरान समय-समय पर अपडेट किया जाता है.