प्लेलिस्ट

प्लेलिस्ट एपीआई को 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.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 के साथ कॉल किया जाएगा. टाइमलाइन अपडेट होने की अन्य वजहें:

  • अडैप्टिव मीडिया आइटम तैयार करने के बाद, मेनिफ़ेस्ट उपलब्ध होना.
  • लाइव स्ट्रीम के चलने के दौरान, समय-समय पर अपडेट किया जाने वाला मेनिफ़ेस्ट.