প্লেয়ার ইন্টারফেস

প্লেয়ার হল আপনার অ্যাপের একটি উপাদান যা মিডিয়া আইটেমগুলির প্লেব্যাক সহজতর করে। Media3 Player ইন্টারফেসটি সাধারণত একটি প্লেয়ার দ্বারা পরিচালিত কার্যকারিতার জন্য একটি রূপরেখা সেট করে। এর মধ্যে রয়েছে:

  • প্লেব্যাক নিয়ন্ত্রণগুলিকে প্রভাবিত করা, যেমন বাজানো, থামানো এবং খোঁজা
  • বর্তমানে চলমান মিডিয়ার বৈশিষ্ট্য অনুসন্ধান করা, যেমন প্লেব্যাক অবস্থান
  • মিডিয়া আইটেমের একটি প্লেলিস্ট/সারি পরিচালনা করা
  • প্লেব্যাক বৈশিষ্ট্যগুলি কনফিগার করা, যেমন শাফলিং, পুনরাবৃত্তি, গতি এবং ভলিউম
  • স্ক্রিনে ভিডিও রেন্ডার করা হচ্ছে

Media3 Player ইন্টারফেসের একটি বাস্তবায়নও প্রদান করে, যার নাম ExoPlayer

উপাদানগুলির মধ্যে একটি সাধারণ ইন্টারফেস

Media3 এর বেশ কিছু উপাদান প্লেয়ার ইন্টারফেস বাস্তবায়ন করে, উদাহরণস্বরূপ:

উপাদান বর্ণনা এবং আচরণের নোট
ExoPlayer একটি মিডিয়া প্লেয়ার API, এবং Player ইন্টারফেসের ডিফল্ট বাস্তবায়ন।
MediaController প্লেব্যাক কমান্ড পাঠানোর জন্য একটি MediaSession এর সাথে ইন্টারঅ্যাক্ট করে। যদি আপনার Player এবং MediaSession আপনার Player এর UI থাকা Activity বা Fragment থেকে আলাদা কোনও Service থাকে, তাহলে আপনি আপনার PlayerView UI এর জন্য আপনার MediaController প্লেয়ার হিসেবে বরাদ্দ করতে পারেন। প্লেব্যাক এবং প্লেলিস্ট পদ্ধতির কলগুলি আপনার MediaSession মাধ্যমে আপনার Player এ পাঠানো হয়।
MediaBrowser একটি MediaController দ্বারা প্রদত্ত কার্যকারিতা ছাড়াও, উপলব্ধ মিডিয়া সামগ্রী ব্রাউজ করার জন্য একটি MediaLibrarySession এর সাথে ইন্টারঅ্যাক্ট করে।
SimpleBasePlayer একটি Player বাস্তবায়ন যা বাস্তবায়নের জন্য প্রয়োজনীয় পদ্ধতির সংখ্যা সর্বনিম্ন করে দেয়। MediaSession এর সাথে সংযোগ স্থাপন করতে চান এমন একটি কাস্টম প্লেয়ার ব্যবহার করার সময় সহায়ক।
ForwardingSimpleBasePlayer একটি SimpleBasePlayer সাবক্লাস যা অন্য Player প্লেব্যাক অপারেশন ফরোয়ার্ড করার জন্য ডিজাইন করা হয়েছে এবং একই সাথে SimpleBasePlayer এর মতো একই ধারাবাহিক আচরণ কাস্টমাইজেশনের অনুমতি দেয়। নির্দিষ্ট প্লেব্যাক অপারেশন দমন বা পরিবর্তন করতে এই ক্লাসটি ব্যবহার করুন।
CastPlayer একটি Player বাস্তবায়ন যা একটি কাস্ট রিসিভার অ্যাপের সাথে যোগাযোগ করে। আচরণ অন্তর্নিহিত কাস্ট সেশনের উপর নির্ভর করে।

যদিও MediaSession Player ইন্টারফেস বাস্তবায়ন করে না, তবুও এটি তৈরি করার সময় একটি Player প্রয়োজন হয়। এর উদ্দেশ্য হল অন্যান্য প্রক্রিয়া বা থ্রেড থেকে Player অ্যাক্সেস প্রদান করা।

মিডিয়া৩ প্লেব্যাক আর্কিটেকচার

যদি আপনার কাছে Player অ্যাক্সেস থাকে, তাহলে প্লেব্যাক কমান্ড ইস্যু করার জন্য আপনার সরাসরি এর পদ্ধতিগুলি কল করা উচিত। আপনি MediaSession প্রয়োগ করে আপনার প্লেব্যাকের বিজ্ঞাপন দিতে পারেন এবং বহিরাগত উৎসগুলিকে প্লেব্যাক নিয়ন্ত্রণ প্রদান করতে পারেন। এই বহিরাগত উৎসগুলি একটি MediaController প্রয়োগ করে, যা একটি মিডিয়া সেশনের সাথে সংযোগ স্থাপন এবং প্লেব্যাক কমান্ড অনুরোধ জারি করার সুবিধা প্রদান করে।

ব্যাকগ্রাউন্ডে মিডিয়া চালানোর সময়, আপনার মিডিয়া সেশন এবং প্লেয়ারকে একটি MediaSessionService বা MediaLibraryService মধ্যে রাখতে হবে যা একটি ফোরগ্রাউন্ড পরিষেবা হিসেবে চলে। যদি আপনি তা করেন, তাহলে আপনি আপনার অ্যাপের অ্যাক্টিভিটি থেকে আপনার প্লেয়ারকে আলাদা করতে পারেন যেখানে প্লেব্যাক নিয়ন্ত্রণের জন্য UI রয়েছে। এর জন্য আপনাকে একটি মিডিয়া কন্ট্রোলার ব্যবহার করতে হতে পারে।

একটি ডায়াগ্রামে দেখানো হয়েছে কিভাবে Media3 প্লেব্যাক উপাদানগুলি একটি মিডিয়া অ্যাপ আর্কিটেকচারে ফিট করে।
চিত্র ১ : মিডিয়া৩ এর স্থাপত্যে Player ইন্টারফেস একটি গুরুত্বপূর্ণ ভূমিকা পালন করে।

খেলোয়াড়ের অবস্থা

Player ইন্টারফেস বাস্তবায়নকারী একটি মিডিয়া প্লেয়ারের অবস্থা মূলত 4 ধরণের তথ্য নিয়ে গঠিত:

  1. প্লেব্যাক অবস্থা
  2. মিডিয়া আইটেমের প্লেলিস্ট
    • প্লেব্যাকের জন্য MediaItem ইনস্ট্যান্সের একটি ক্রম।
    • getCurrentTimeline() দিয়ে পুনরুদ্ধার করুন
    • Player ইনস্ট্যান্সগুলি প্লেলিস্ট অপারেশন পদ্ধতি যেমন MediaItem যোগ করা বা অপসারণ করা এবং getCurrentMediaItem() মতো সুবিধাজনক পদ্ধতি প্রদান করতে পারে।
  3. প্লে/পজ প্রপার্টি, যেমন:
    • playWhenReady : ব্যবহারকারী যখন সম্ভব মিডিয়া চালাতে চান নাকি পজড রাখতে চান তা নির্দেশ করে।
    • প্লেব্যাক দমনের কারণ : প্লেব্যাক দমন কেন করা হচ্ছে তার একটি ইঙ্গিত, যদি প্রযোজ্য হয়, এমনকি যদি playWhenReady true হয়
    • isPlaying : প্লেয়ারটি বর্তমানে খেলছে কিনা তার একটি ইঙ্গিত, যা কেবল তখনই true হবে যদি প্লেব্যাক অবস্থা STATE_READY হয়, playWhenReady true হয় এবং প্লেব্যাক দমন করা না হয়।
  4. প্লেব্যাক অবস্থান, সহ:

এছাড়াও, Player ইন্টারফেসটি উপলব্ধ ট্র্যাক , মিডিয়া মেটাডেটা , প্লেব্যাকের গতি , ভলিউম এবং প্লেব্যাকের অন্যান্য সহায়ক বৈশিষ্ট্যগুলিতে অ্যাক্সেসের অনুমতি দেয়।

পরিবর্তনগুলি শুনুন

Player.Listener ব্যবহার করে Player এ পরিবর্তনগুলি শুনতে পারবেন। Listener তৈরি এবং ব্যবহার করার পদ্ধতি সম্পর্কে বিস্তারিত জানতে Player ইভেন্টের ExoPlayer ডকুমেন্টেশন দেখুন।

মনে রাখবেন যে লিসেনার ইন্টারফেসে স্বাভাবিক প্লেব্যাক অগ্রগতি ট্র্যাক করার জন্য কোনও কলব্যাক অন্তর্ভুক্ত নেই। প্লেব্যাক অগ্রগতি ক্রমাগত পর্যবেক্ষণ করতে, যেমন একটি অগ্রগতি বার UI সেট আপ করতে, আপনার সঠিক বিরতিতে বর্তমান অবস্থানটি জিজ্ঞাসা করা উচিত।

কোটলিন

val handler = Handler(Looper.getMainLooper())
fun checkPlaybackPosition(delayMs: Long): Boolean =
  handler.postDelayed(
    {
      val currentPosition = player.currentPosition
      // Update UI based on currentPosition
      checkPlaybackPosition(delayMs)
    },
    delayMs)

জাভা

Handler handler = new Handler(Looper.getMainLooper());
boolean checkPlaybackPosition(long delayMs) {
    return handler.postDelayed(() -> {
        long currentPosition = player.getCurrentPosition();
        // Update UI based on currentPosition
        checkPlaybackPosition(delayMs);
    }, delayMs);
}

প্লেব্যাক নিয়ন্ত্রণ করুন

Player ইন্টারফেসটি অবস্থা নিয়ন্ত্রণ এবং প্লেব্যাক নিয়ন্ত্রণের অনেক উপায় অফার করে:

কাস্টম Player বাস্তবায়ন

একটি কাস্টম প্লেয়ার তৈরি করতে, আপনি Media3-তে অন্তর্ভুক্ত SimpleBasePlayer প্রসারিত করতে পারেন। এই ক্লাসটি Player ইন্টারফেসের একটি বেস বাস্তবায়ন প্রদান করে যাতে আপনার প্রয়োগ করার জন্য প্রয়োজনীয় পদ্ধতির সংখ্যা সর্বনিম্ন করা যায়।

getState() পদ্ধতিটি ওভাররাইড করে শুরু করুন। কল করার সময় এই পদ্ধতিতে বর্তমান প্লেয়ার স্টেট পূরণ করা উচিত, যার মধ্যে রয়েছে:

  • উপলব্ধ কমান্ডের সেট
  • প্লেব্যাক বৈশিষ্ট্য, যেমন প্লেব্যাক অবস্থা STATE_READY থাকাকালীন প্লেয়ারটি বাজানো শুরু করা উচিত কিনা, বর্তমানে চলমান মিডিয়া আইটেমের সূচী এবং বর্তমান আইটেমের মধ্যে প্লেব্যাক অবস্থান।

কোটলিন

class CustomPlayer : SimpleBasePlayer(looper) {
  override fun getState(): State {
    return State.Builder()
      .setAvailableCommands(...) // Set which playback commands the player can handle
      // Configure additional playback properties
      .setPlayWhenReady(true, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST)
      .setCurrentMediaItemIndex(0)
      .setContentPositionMs(0)
      .build()
  }
}

জাভা

public class CustomPlayer extends SimpleBasePlayer {
  public CustomPlayer(Looper looper) {
    super(looper);
  }

  @Override
  protected State getState() {
    return new State.Builder()
      .setAvailableCommands(...) // Set which playback commands the player can handle
      // Configure additional playback properties
      .setPlayWhenReady(true, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST)
      .setCurrentMediaItemIndex(0)
      .setContentPositionMs(0)
      .build();
  }
}

SimpleBasePlayer বলবৎ করবে যে State তৈরি করা হয়েছে একটি বৈধ state মান সমন্বয়ে। এটি শ্রোতাদের এবং শ্রোতাদের state পরিবর্তন সম্পর্কে অবহিত করার কাজও করবে। যদি আপনার ম্যানুয়ালি state আপডেট ট্রিগার করার প্রয়োজন হয়, তাহলে invalidateState() কল করুন।

getState() পদ্ধতির বাইরে, আপনাকে কেবল সেই পদ্ধতিগুলি বাস্তবায়ন করতে হবে যা আপনার প্লেয়ার দ্বারা উপলব্ধ বলে ঘোষিত কমান্ডগুলির জন্য ব্যবহৃত হয়। আপনি যে কার্যকারিতাটি বাস্তবায়ন করতে চান তার সাথে সঙ্গতিপূর্ণ ওভাররাইডেবল হ্যান্ডলার পদ্ধতিটি খুঁজুন। উদাহরণস্বরূপ, COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM এবং COMMAND_SEEK_TO_NEXT_MEDIA_ITEM মতো ক্রিয়াকলাপগুলিকে সমর্থন করার জন্য handleSeek() পদ্ধতিটি ওভাররাইড করুন।

Player বাস্তবায়ন পরিবর্তন করুন

সম্পূর্ণ কাস্টম Player তৈরি করার পরিবর্তে, আপনি ForwardingSimpleBasePlayer ব্যবহার করে বিদ্যমান Player অবস্থা এবং আচরণ পরিবর্তন করতে পারেন। আরও বিস্তারিত জানার জন্য কাস্টমাইজেশন পৃষ্ঠার নির্দেশিকাটি দেখুন।