প্লেলিস্ট

প্লেলিস্ট API Player ইন্টারফেস দ্বারা সংজ্ঞায়িত করা হয়, যা সমস্ত ExoPlayer বাস্তবায়ন দ্বারা বাস্তবায়িত হয়। প্লেলিস্টগুলি একাধিক মিডিয়া আইটেমের ক্রমিক প্লেব্যাক সক্ষম করে। নিম্নলিখিত উদাহরণটি দেখায় যে দুটি ভিডিও ধারণকারী প্লেলিস্টের প্লেব্যাক কীভাবে শুরু করবেন:

কোটলিন

// 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()

জাভা

// 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 একাধিকবার ব্যবহার করতে পারেন।

প্লেলিস্ট পরিবর্তন করা হচ্ছে

আপনি মিডিয়া আইটেম যোগ করে, সরানো, অপসারণ করে বা প্রতিস্থাপন করে একটি প্লেলিস্টকে গতিশীলভাবে পরিবর্তন করতে পারেন। এটি প্লেব্যাকের আগে এবং প্লেব্যাকের সময় উভয় ক্ষেত্রেই সংশ্লিষ্ট প্লেলিস্ট API পদ্ধতি ব্যবহার করে করা যেতে পারে:

কোটলিন

// 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))

জাভা

// 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));

সম্পূর্ণ প্লেলিস্ট প্রতিস্থাপন এবং সাফ করাও সমর্থিত:

কোটলিন

// 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()

জাভা

// 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 এর মতো অন্যান্য সুবিধাজনক পদ্ধতিও রয়েছে।

পুনরাবৃত্তি মোড

প্লেয়ারটি 3টি পুনরাবৃত্তি মোড সমর্থন করে যা 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 কনস্ট্রাক্টরে একটি কাস্টম অর্ডার সেট করে কাস্টমাইজ করা যেতে পারে:

কোটলিন

// 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

জাভা

// 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 সেট করা যেতে পারে:

কোটলিন

// Build a media item with a media ID.
val mediaItem = MediaItem.Builder().setUri(uri).setMediaId(mediaId).build()

জাভা

// Build a media item with a media ID.
MediaItem mediaItem = new MediaItem.Builder().setUri(uri).setMediaId(mediaId).build();

যদি কোনও অ্যাপ কোনও মিডিয়া আইটেমের জন্য স্পষ্টভাবে মিডিয়া আইডি সংজ্ঞায়িত না করে, তাহলে URI-এর স্ট্রিং উপস্থাপনা ব্যবহার করা হয়।

প্লেলিস্ট আইটেমের সাথে অ্যাপ ডেটা সংযুক্ত করা হচ্ছে

একটি আইডি ছাড়াও, প্রতিটি মিডিয়া আইটেম একটি কাস্টম ট্যাগ দিয়েও কনফিগার করা যেতে পারে, যা যেকোনো অ্যাপ প্রদত্ত বস্তু হতে পারে। কাস্টম ট্যাগের একটি ব্যবহার হল প্রতিটি মিডিয়া আইটেমের সাথে মেটাডেটা সংযুক্ত করা:

কোটলিন

// Build a media item with a custom tag.
val mediaItem = MediaItem.Builder().setUri(uri).setTag(metadata).build()

জাভা

// Build a media item with a custom tag.
MediaItem mediaItem = new MediaItem.Builder().setUri(uri).setTag(metadata).build();

প্লেব্যাক অন্য মিডিয়া আইটেমে স্থানান্তরিত হলে সনাক্ত করা হচ্ছে

যখন প্লেব্যাক অন্য মিডিয়া আইটেমে রূপান্তরিত হয়, অথবা একই মিডিয়া আইটেম পুনরাবৃত্তি শুরু করে, Listener.onMediaItemTransition(MediaItem, @MediaItemTransitionReason) কল করা হয়। এই কলব্যাকটি নতুন মিডিয়া আইটেমটি গ্রহণ করে, সাথে একটি @MediaItemTransitionReason যা নির্দেশ করে যে কেন রূপান্তরটি ঘটেছে। onMediaItemTransition এর একটি সাধারণ ব্যবহার হল নতুন মিডিয়া আইটেমের জন্য অ্যাপের UI আপডেট করা:

কোটলিন

override fun onMediaItemTransition(
  mediaItem: MediaItem?,
  @MediaItemTransitionReason reason: Int,
) {
  updateUiForPlayingMediaItem(mediaItem)
}

জাভা

@Override
public void onMediaItemTransition(
    @Nullable MediaItem mediaItem, @MediaItemTransitionReason int reason) {
  updateUiForPlayingMediaItem(mediaItem);
}

যদি UI আপডেট করার জন্য প্রয়োজনীয় মেটাডেটা কাস্টম ট্যাগ ব্যবহার করে প্রতিটি মিডিয়া আইটেমের সাথে সংযুক্ত করা থাকে, তাহলে একটি বাস্তবায়ন এরকম দেখাতে পারে:

কোটলিন

override fun onMediaItemTransition(
  mediaItem: MediaItem?,
  @MediaItemTransitionReason reason: Int,
) {
  var metadata: CustomMetadata? = null
  mediaItem?.localConfiguration?.let { localConfiguration ->
    metadata = localConfiguration.tag as? CustomMetadata
  }
  updateUiForPlayingMediaItem(metadata)
}

জাভা

@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 দিয়ে তাৎক্ষণিকভাবে কল করা হয়। প্লেয়ারটি এখনও প্রস্তুত না হলেও এই কলব্যাকটি কল করা হয়।

কোটলিন

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)
  }
}

জাভা

@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 দিয়ে কল করা হবে। টাইমলাইন আপডেটের কারণ হতে পারে এমন অন্যান্য কারণগুলির মধ্যে রয়েছে:

  • একটি অভিযোজিত মিডিয়া আইটেম প্রস্তুত করার পরে একটি ম্যানিফেস্ট উপলব্ধ হচ্ছে।
  • লাইভ স্ট্রিমের প্লেব্যাকের সময় পর্যায়ক্রমে আপডেট করা একটি ম্যানিফেস্ট।