একটি প্লেয়ার হল আপনার অ্যাপের উপাদান যা মিডিয়া আইটেমগুলির প্লেব্যাকের সুবিধা দেয়৷ মিডিয়া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 ধারণকারী আপনার অ্যাপের কার্যকলাপ থেকে আপনার প্লেয়ারটিকে আলাদা করতে পারেন। এটি আপনাকে একটি মিডিয়া কন্ট্রোলার ব্যবহার করার প্রয়োজন হতে পারে।
খেলোয়াড়ের অবস্থা
Player
ইন্টারফেস বাস্তবায়নকারী একটি মিডিয়া প্লেয়ারের অবস্থা প্রাথমিকভাবে 4 টি বিভাগের তথ্য নিয়ে গঠিত:
- প্লেব্যাক অবস্থা
-
getPlaybackState()
দিয়ে পুনরুদ্ধার করুন। - ইন্টারফেস দ্বারা সংজ্ঞায়িত রাষ্ট্রীয় মান হল
STATE_IDLE
,STATE_BUFFERING
,STATE_READY
, এবংSTATE_ENDED
৷
-
- মিডিয়া আইটেম প্লেলিস্ট
- প্লেব্যাকের জন্য
MediaItem
দৃষ্টান্তগুলির একটি ক্রম। -
getCurrentTimeline()
দিয়ে পুনরুদ্ধার করুন -
Player
ইনস্ট্যান্স প্লেলিস্ট অপারেশন পদ্ধতি প্রদান করতে পারে যেমনMediaItem
যোগ করা বা সরানো এবং সুবিধার পদ্ধতি যেমনgetCurrentMediaItem()
।
- প্লেব্যাকের জন্য
- প্লে/পজ বৈশিষ্ট্য, যেমন:
-
playWhenReady
: ব্যবহারকারী যখন সম্ভব মিডিয়া চালাতে চান বা বিরতি রাখতে চান কিনা তার একটি ইঙ্গিত৷ - প্লেব্যাক দমনের কারণ : প্লেব্যাক কেন দমন করা হয় তার একটি ইঙ্গিত, যদি প্রযোজ্য হয়, এমনকি
playWhenReady
true
হলেও -
isPlaying
: প্লেয়ার বর্তমানে খেলছে কিনা তার একটি ইঙ্গিত, যা প্লেব্যাক স্টেটSTATE_READY
হলেইtrue
হবে,playWhenReady
true
, এবং প্লেব্যাক চাপা না থাকলে
-
- প্লেব্যাক অবস্থান, সহ:
- বর্তমান মিডিয়া আইটেম সূচক : প্লেলিস্টে বর্তমান
MediaItem
সূচী। -
isPlayingAd
: একটি সন্নিবেশিত বিজ্ঞাপন চলছে কিনা তার ইঙ্গিত৷ - বর্তমান প্লেব্যাক অবস্থান : বর্তমান
MediaItem
বা সন্নিবেশিত বিজ্ঞাপনের মধ্যে বর্তমান প্লেব্যাক অবস্থান।
- বর্তমান মিডিয়া আইটেম সূচক : প্লেলিস্টে বর্তমান
উপরন্তু, 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
ইন্টারফেস রাষ্ট্র পরিচালনা এবং প্লেব্যাক নিয়ন্ত্রণ করার অনেক উপায় অফার করে:
- প্রাথমিক প্লেব্যাক নিয়ন্ত্রণ যেমন
play()
,pause()
,prepare()
এবংstop()
। - প্লেলিস্ট অপারেশন যেমন
addMediaItem()
বাremoveMediaItem()
। - বর্তমান আইটেম বা অবস্থান পরিবর্তন করতে চাইছেন .
- পুনরাবৃত্তি মোড এবং শাফেল মোড সেট করুন।
- ট্র্যাক নির্বাচন পছন্দ আপডেট করুন।
- প্লেব্যাকের গতি সেট করুন।
কাস্টম 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()
পদ্ধতিটি ওভাররাইড করুন।