प्लेलिस्ट

प्लेलिस्ट एपीआई को 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 वीडियो के लिए). वे अलग-अलग तरह के भी हो सकते हैं (यानी, यह किसी प्लेलिस्ट में वीडियो, इमेज, और सिर्फ़ ऑडियो स्ट्रीम शामिल करें). Google आपके यूआरएल पैरामीटर को कैसे इस्तेमाल करेगा, यह तय करने के लिए एक प्लेलिस्ट में एक ही MediaItem को कई बार.

प्लेलिस्ट में बदलाव किया जा रहा है

प्लेलिस्ट को जोड़कर, हटाकर, हटाकर या बदलकर, प्लेलिस्ट में डाइनैमिक तरीके से बदलाव किया जा सकता है मीडिया आइटम. वीडियो चलाने से पहले और चलने के दौरान, इससे जुड़े प्लेलिस्ट API के तरीके:

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 के साथ. अन्य वजहें, जिनसे हो सकता है कि टाइमलाइन में ये अपडेट शामिल हैं:

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