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

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

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

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

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

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

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

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

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

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

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

মিডিয়া অ্যাপ আর্কিটেকচারে মিডিয়া3 প্লেব্যাক উপাদানগুলি কীভাবে ফিট করে তা দেখানো একটি চিত্র।
চিত্র 1 : Player ইন্টারফেস মিডিয়া3 এর আর্কিটেকচারে একটি মুখ্য ভূমিকা পালন করে।

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

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

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

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

পরিবর্তনের জন্য শুনুন

Player পরিবর্তনের জন্য শোনার জন্য একটি Player.Listener ব্যবহার করুন। কিভাবে একজন শ্রোতা তৈরি এবং ব্যবহার করতে হয় তার বিশদ বিবরণের জন্য প্লেয়ার ইভেন্টগুলিতে 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 রাষ্ট্রীয় মানগুলির একটি বৈধ সংমিশ্রণে তৈরি করা হয়েছে। এটি শ্রোতাদের পরিচালনা করবে এবং শ্রোতাদের রাষ্ট্রের পরিবর্তন সম্পর্কে অবহিত করবে। আপনি যদি ম্যানুয়ালি একটি স্টেট আপডেট ট্রিগার করতে চান, invalidateState() কল করুন।

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