1. ভূমিকা
শেষ আপডেট: 2020-09-09
ভিডিও প্লেব্যাকের আশেপাশে একটি MediaSession যোগ করার সুবিধাগুলি কী কী?
মিডিয়া সেশনগুলি অ্যান্ড্রয়েড প্ল্যাটফর্ম এবং মিডিয়া অ্যাপগুলির মধ্যে একটি অবিচ্ছেদ্য লিঙ্ক৷ এটি শুধুমাত্র Android-কে জানায় যে মিডিয়া চলছে—যাতে এটি মিডিয়া অ্যাকশনগুলিকে সঠিক সেশনে ফরোয়ার্ড করতে পারে—কিন্তু এটি প্ল্যাটফর্মকে কী বাজছে এবং কীভাবে এটি নিয়ন্ত্রণ করা যেতে পারে তাও জানায়৷
আপনার অ্যাপের মাধ্যমে একটি MediaSession প্রকাশ করার বিভিন্ন সুবিধা রয়েছে যা ব্যবহারকারীরা উপভোগ করবেন। এখানে কয়েকটি দুর্দান্ত উদাহরণ রয়েছে।
গুগল সহকারী
ব্যবহারকারীরা "পজ," "পুনরায় শুরু করুন" এবং "পরবর্তী" এর মতো ভয়েস কমান্ডের মাধ্যমে আপনার অ্যাপের মিডিয়ার সাথে সহজেই যোগাযোগ করতে পারে। বর্তমানে যা চলছে তার উত্তর পেতে আপনার মিডিয়া থেকে মেটাডেটাও ব্যবহার করা যেতে পারে।
অ্যান্ড্রয়েড টিভি
বড় স্ক্রিনের অভিজ্ঞতায়, আপনার Android TV অ্যাপ HDMI-CEC সমর্থিত টিভি সহ ব্যবহারকারীদের জন্য প্রচলিত রিমোট কন্ট্রোল ব্যবহার করতে পারে। প্লে/পজ, স্টপ, পরবর্তী এবং আগের বোতাম দ্বারা জারি করা কমান্ডগুলি আপনার অ্যাপে রিলে করা হয়।
অন-স্ক্রীন মিডিয়া নিয়ন্ত্রণ
Android 4.0 (API স্তর 14) দিয়ে শুরু করে, সিস্টেমটি একটি মিডিয়া সেশনের প্লেব্যাক অবস্থা এবং মেটাডেটা অ্যাক্সেস করতে পারে। এই কার্যকারিতা মিডিয়া নিয়ন্ত্রণ এবং আর্টওয়ার্ক প্রদর্শন করতে লক স্ক্রীনকে সক্ষম করে। এই আচরণ Android এর সংস্করণের উপর নির্ভর করে পরিবর্তিত হয়।
ব্যাকগ্রাউন্ড মিডিয়া
মিডিয়া প্লে করা অ্যাপটি ব্যাকগ্রাউন্ডে চললেও এই পরিস্থিতিতে যেকোনও মিডিয়াকে নিয়ন্ত্রণ করা যেতে পারে।
পরিবেষ্টিত কম্পিউটিং
কী বাজছে এবং কীভাবে এটি নিয়ন্ত্রণ করা যায় সে সম্পর্কে ডেটা সহ আপনার মিডিয়া প্রকাশ করা ডিভাইসগুলির মধ্যে সেতুবন্ধন তৈরি করতে পারে যাতে ব্যবহারকারীরা বিভিন্ন উপায়ে এটির সাথে ইন্টারঅ্যাক্ট করতে পারে যা তারা উপভোগ করতে পারে৷
আপনি কি নির্মাণ করবেন
এই কোডল্যাবে, আপনি মিডিয়া সেশন সমর্থন যোগ করতে বিদ্যমান Exoplayer নমুনা প্রসারিত করতে যাচ্ছেন। আপনার অ্যাপ হবে:
- মিডিয়া সেশনের সক্রিয় অবস্থা সঠিকভাবে প্রতিফলিত করুন
- এক্সোপ্লেয়ারে মিডিয়া নিয়ন্ত্রণ রিলে
- মিডিয়া সেশনে সারিতে থাকা আইটেমগুলির মেটাডেটা পাস করুন
আপনি কি শিখবেন
- কেন মিডিয়া সেশন ব্যবহারকারীদের একটি সমৃদ্ধ অভিজ্ঞতা প্রদান করে
- কিভাবে একটি মিডিয়া সেশন তৈরি করতে হয় এবং তার অবস্থা পরিচালনা করতে হয়
- ExoPlayer এর সাথে মিডিয়া সেশন কিভাবে সংযুক্ত করবেন
- মিডিয়া সেশনে প্লেব্যাক সারিতে আইটেমগুলির মেটাডেটা কীভাবে অন্তর্ভুক্ত করবেন
- কিভাবে অতিরিক্ত (কাস্টম) অ্যাকশন যোগ করবেন
এই কোডল্যাবটি MediaSession SDK-এ ফোকাস করে। ExoPlayer বাস্তবায়নের বিশদ বিবরণ সহ অ-প্রাসঙ্গিক ধারণা এবং কোড ব্লকগুলি নিয়ে আলোচনা করা হয়নি তবে আপনাকে কেবল অনুলিপি এবং পেস্ট করার জন্য সরবরাহ করা হয়েছে।
আপনি কি প্রয়োজন হবে
- অ্যান্ড্রয়েড স্টুডিওর একটি সাম্প্রতিক সংস্করণ (3.5 বা তার পরে)
- অ্যান্ড্রয়েড অ্যাপ্লিকেশন বিকাশের প্রাথমিক জ্ঞান
2. সেট আপ করা হচ্ছে
আমাদের শুরু বিন্দু কি?
আমাদের সূচনা পয়েন্ট হল ExoPlayer থেকে প্রধান ডেমো। এই ডেমোতে অন-স্ক্রীন প্লেব্যাক কন্ট্রোল সহ ভিডিও রয়েছে, কিন্তু বাক্সের বাইরে মিডিয়া সেশন ব্যবহার করে না। এটা আমাদের জন্য একটি চমৎকার জায়গা ডুব এবং তাদের যোগ!
ExoPlayer নমুনা পান
চলমান শুরুর জন্য, আসুন ExoPlayer নমুনা দিয়ে শুরু করি। নীচের কোডটি চালিয়ে GitHub সংগ্রহস্থল ক্লোন করুন।
git clone https://github.com/google/ExoPlayer.git
ডেমো খুলুন
অ্যান্ড্রয়েড স্টুডিওতে, demos/main
অধীনে অবস্থিত প্রধান ডেমো প্রকল্পটি খুলুন।
অ্যান্ড্রয়েড স্টুডিও আপনাকে SDK পাথ সেট করতে অনুরোধ করবে। আপনি কোনো সমস্যার সম্মুখীন হলে IDE এবং SDK টুল আপডেট করার জন্য সুপারিশগুলি অনুসরণ করতে চাইতে পারেন।
যদি আপনাকে সর্বশেষ গ্রেডল সংস্করণ ব্যবহার করতে বলা হয়, এগিয়ে যান এবং এটি আপডেট করুন।
অ্যাপটি কীভাবে ডিজাইন করা হয়েছে তার প্রাথমিক ধারণা পেতে কিছুক্ষণ সময় নিন। মনে রাখবেন যে দুটি ক্রিয়াকলাপ রয়েছে: SampleChooserActivity এবং PlayerActivity. আমরা প্লেয়ারঅ্যাক্টিভিটিতে কোডল্যাবের বাকী অংশ ব্যয় করব, যেখানে মিডিয়া আসলে চলে, তাই এই ক্লাসটি খুলুন এবং পরবর্তী বিভাগে যান।
3. একটি মিডিয়া সেশন তৈরি করুন এবং এর অবস্থা পরিচালনা করুন
মিডিয়া সেশন তৈরি করুন
PlayerActivity.java
খুলুন। এই ক্লাসটি ExoPlayer তৈরি করে এবং এর ফাংশনগুলি পরিচালনা করে, যেমন স্ক্রিনে ভিডিও রেন্ডার করা। এই কার্যকলাপে, আমরা ExoPlayer কে একটি মিডিয়া সেশনের সাথে সংযুক্ত করব।
ক্লাসের শীর্ষে নিম্নলিখিত দুটি ক্ষেত্র ঘোষণা করুন। আমরা এই বিভাগে এই ক্ষেত্রগুলি ব্যবহার করব।
private MediaSessionCompat mediaSession;
private MediaSessionConnector mediaSessionConnector;
আপনাকে "মডিউল: ডেমো" এর জন্য মডিউল-স্তরের build.gradle
এ "এক্সটেনশন-মিডিয়াসেসন" প্রকল্প নির্ভরতা যোগ করতে হবে:
implementation project(path: ':extension-mediasession')
মনে রাখবেন যে Android স্টুডিও আপনাকে এই নির্ভরতা স্বয়ংক্রিয়ভাবে যোগ করতে সাহায্য করতে পারে যদি আপনি MediaSessionConnector সমাধান করার সাথে ত্রুটির উপর মাউস করেন:
অবশেষে, নিম্নলিখিত যোগ করে ক্লাস আমদানি সমাধান করুন:
import android.support.v4.media.session.MediaSessionCompat;
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;
যখন কার্যকলাপটি তৈরি হয় তখন আমরা একটি মিডিয়া সেশন এবং একটি মিডিয়া সেশন সংযোগকারী তৈরি করতে চাই যা মিডিয়া সেশন এবং ExoPlayer এর মধ্যে মধ্যস্থতাকারী হিসাবে কাজ করে৷
এটি সন্নিবেশ করার জন্য আদর্শ জায়গা যেখানে ExoPlayer তৈরি করা হয়েছে। আমাদের ডেমো অ্যাপে, আমরা initializePlayer()
এর শেষে আমাদের কোড যোগ করতে পারি। প্লেয়ার ইনস্ট্যান্ট হওয়ার পরে এই যুক্তি যোগ করতে ভুলবেন না!
private void initializePlayer() {
if (player == null) {
...
player = ...
...
mediaSession = new MediaSessionCompat(this, "sample");
mediaSessionConnector = new MediaSessionConnector(mediaSession);
mediaSessionConnector.setPlayer(player);
}
...
}
মিডিয়া অধিবেশন মুক্তি
মিডিয়া সেশনটি ছেড়ে দিন যখন এটির আর প্রয়োজন নেই। যখন আমরা ExoPlayer releasePlayer()
এ প্রকাশ করি, তখন আমরা তা করতে নিম্নলিখিত কোডটিও অন্তর্ভুক্ত করতে পারি:
private void releasePlayer() {
if (mediaSession != null) {
mediaSession.release();
}
...
}
মিডিয়া সেশনের অবস্থা পরিচালনা করুন
এখন যেহেতু আমরা মিডিয়া সেশনটি চালু করেছি, আমাদের নিশ্চিত করতে হবে যে ব্যবহারকারী কার্যকলাপের সাথে ইন্টারঅ্যাক্ট করার সাথে সাথে এটির অবস্থা সঠিকভাবে প্রতিফলিত হয়েছে।
যখন ব্যবহারকারী কার্যকলাপ শুরু করেন, মিডিয়া সেশন সক্রিয় হওয়া উচিত:
@Override
public void onStart() {
...
if (mediaSession != null) {
mediaSession.setActive(true);
}
}
যেহেতু আমাদের অ্যাপ্লিকেশনটি ব্যাকগ্রাউন্ডে মিডিয়া চালায় না, তাই এটি নিশ্চিত করা অপরিহার্য যে ব্যবহারকারীর কার্যকলাপ ছেড়ে যাওয়ার সাথে সাথে মিডিয়া সেশনটি নিষ্ক্রিয় হয়ে যায়:
@Override
public void onStop() {
super.onStop();
if (mediaSession != null) {
mediaSession.setActive(false);
}
...
}
এর ডেমো চালানো যাক
- একটি Android ডিভাইস সংযুক্ত করুন বা একটি এমুলেটর শুরু করুন৷
- নিশ্চিত করুন যে Android স্টুডিও টুলবার থেকে চালানোর জন্য "ডেমো" নির্বাচন করা হয়েছে।
- ক্লিক করুন অ্যান্ড্রয়েড স্টুডিও টুলবার থেকে।
- একবার আপনার ডিভাইসে অ্যাপটি চালু হলে, চালানোর জন্য একটি ভিডিও স্ট্রিম নির্বাচন করুন।
- প্লেব্যাক শুরু হলে, মিডিয়া সেশন নিয়ন্ত্রণ করতে নিম্নলিখিত
adb
কমান্ডগুলি ব্যবহার করে অন্বেষণ করুন:
adb shell media dispatch pause
adb shell media dispatch play
adb shell media dispatch play-pause
adb shell media dispatch fast-forward
adb shell media dispatch rewind
- অ্যান্ড্রয়েড কীভাবে আপনার মিডিয়া সেশন দেখে তাও অন্বেষণ করুন। বিশেষ করে, আপনি অ্যাকশন ফিল্ড দেখে কোন ক্রিয়াগুলি সমর্থিত তা পরীক্ষা করতে পারেন৷ প্লেব্যাকস্টেট অবজেক্টে ঘোষিত হিসাবে আপনি এখানে যে সংখ্যাটি দেখছেন সেটি অ্যাকশন আইডির সংমিশ্রণ। মিডিয়া সেশন চালানো দেখতে:
adb shell dumpsys media_session
- আপনি যদি একটি মাইক্রোফোন সহ একটি ফিজিক্যাল ডিভাইস ব্যবহার করেন, তাহলে Google অ্যাসিস্ট্যান্ট চালু করে ভয়েস কমান্ড দেওয়ার চেষ্টা করুন, যেমন: "পজ করুন।" "পুনরায় শুরু করুন।" "ফাস্ট-ফরোয়ার্ড 1 মিনিট।"
অ্যান্ড্রয়েড টিভিতে চলমান ExoPlayer নমুনা।
4. প্লেব্যাক সারিতে আইটেমগুলির মেটাডেটা সহ
আমরা এখন আমাদের মিডিয়া সেশনের সমর্থিত বৈশিষ্ট্যগুলিকে প্রসারিত করতে পারি যেখানে আমরা পূর্বে initializePlayer()
এ আমাদের MediaSessionConnector তৈরি করেছিলাম।
একটি TimelineQueueNavigator যোগ করা হচ্ছে
ExoPlayer একটি টাইমলাইন হিসাবে মিডিয়ার গঠন উপস্থাপন করে। এটি কীভাবে কাজ করে তার বিশদ বিবরণের জন্য, ExoPlayer-এর টাইমলাইন অবজেক্ট সম্পর্কে পড়তে একটু সময় নিন। এই স্ট্রাকচারে ট্যাপ করার মাধ্যমে, কন্টেন্ট পরিবর্তন হলে আমরা জানতে পারি এবং জিজ্ঞাসা করা হলে বর্তমানে যা চলছে তার মেটাডেটা প্রকাশ করতে পারি।
এটি সম্পন্ন করার জন্য, আমরা একটি TimelineQueueNavigator সংজ্ঞায়িত করব। initializePlayer()
-এ MediaSessionConnector-এর ইন্সট্যান্সিয়েশন সনাক্ত করুন এবং mediaSession
আরম্ভ হওয়ার পর TimelineQueueNavigator-এর একটি বাস্তবায়ন যোগ করুন।
mediaSessionConnector.setQueueNavigator(new TimelineQueueNavigator(mediaSession) {
@Override
public MediaDescriptionCompat getMediaDescription(Player player, int windowIndex) {
return new MediaDescriptionCompat.Builder()
.setTitle(player.getCurrentMediaItem().mediaMetadata.title)
.setDescription("MediaDescription description for " + windowIndex)
.setSubtitle("MediaDescription subtitle")
.build();
}
});
যোগ করে ক্লাস আমদানি সমাধান করুন:
import android.support.v4.media.MediaDescriptionCompat;
import com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator;
লক্ষ্য করুন যে windowIndex
প্যারামিটারটি প্লেব্যাক সারিতে থাকা সেই সূচকের আইটেমের সাথে মিলে যায়।
এখন আপনি কিছু মেটাডেটা যোগ করেছেন, আপনি পরীক্ষা করতে পারেন যে অ্যাসিস্ট্যান্ট বুঝতে পারে কী চলছে। অ্যান্ড্রয়েড টিভিতে ভিডিও চালানোর সময়, অ্যাসিস্ট্যান্টকে ডাকুন এবং "কী চলছে?"
5. কর্ম কাস্টমাইজ করা
সম্ভবত আপনার প্লেয়ার কিছু ক্রিয়া সমর্থন করে না, বা আপনি আরও কিছুর জন্য সমর্থন অন্তর্ভুক্ত করতে চান? চলুন এখন মিডিয়া সেশনের একটু গভীরে খনন করা যাক যেখানে আমরা পূর্বে initializePlayer()
এ আমাদের MediaSessionConnector তৈরি করেছিলাম।
সমর্থিত কর্ম ঘোষণা
আপনি মিডিয়া সেশন সমর্থন করতে চান এমন ক্রিয়াগুলি কাস্টমাইজ করতে mediaSessionConnector.setEnabledPlaybackActions()
ব্যবহার করার চেষ্টা করুন৷
উল্লেখ্য যে সম্পূর্ণ সেট হল:
mediaSessionConnector.setEnabledPlaybackActions(
PlaybackStateCompat.ACTION_PLAY_PAUSE
| PlaybackStateCompat.ACTION_PLAY
| PlaybackStateCompat.ACTION_PAUSE
| PlaybackStateCompat.ACTION_SEEK_TO
| PlaybackStateCompat.ACTION_FAST_FORWARD
| PlaybackStateCompat.ACTION_REWIND
| PlaybackStateCompat.ACTION_STOP
| PlaybackStateCompat.ACTION_SET_REPEAT_MODE
| PlaybackStateCompat.ACTION_SET_SHUFFLE_MODE
);
আসুন আবার দেখি কিভাবে এই ডেটা প্ল্যাটফর্মে উন্মুক্ত হয়:
- আগের মতই ভিডিও শুরু করুন।
- এক্সপ্লোর করুন কিভাবে অ্যান্ড্রয়েড আপনার মিডিয়া সেশন থেকে মেটাডেটা দেখে:
adb shell dumpsys media_session
- মেটাডেটা সম্বলিত লাইনটি সনাক্ত করুন এবং লক্ষ্য করুন যে শিরোনাম এবং বিবরণ অন্তর্ভুক্ত এবং
com.google.android.exoplayer2.demo/sample
এর সাথে যুক্ত।
অতিরিক্ত কর্ম যোগ করা হচ্ছে
আমরা কিছু অতিরিক্ত কর্মের মাধ্যমে আমাদের মিডিয়া সেশন প্রসারিত করতে পারি। এই বিভাগে, আমরা শুধুমাত্র ক্যাপশনের জন্য সমর্থন যোগ করব।
সমর্থনকারী ক্যাপশন
মিডিয়া সেশনে ক্যাপশনের জন্য সমর্থন যোগ করা ব্যবহারকারীদের ভয়েস দ্বারা তাদের টগল করার অনুমতি দেয়। যেখানে আপনি মিডিয়া সেশন সংযোগকারী শুরু করেছিলেন, সেখানে নিম্নলিখিত যোগ করুন:
mediaSessionConnector.setCaptionCallback(new MediaSessionConnector.CaptionCallback() {
@Override
public void onSetCaptioningEnabled(Player player, boolean enabled) {
Log.d("MediaSession", "onSetCaptioningEnabled: enabled=" + enabled);
}
@Override
public boolean hasCaptions(Player player) {
return true;
}
@Override
public boolean onCommand(Player player, ControlDispatcher controlDispatcher, String command, Bundle extras, ResultReceiver cb) {
return false;
}
}
);
অবশেষে, কোনো অনুপস্থিত আমদানি সমাধান করুন।
আপনি অ্যান্ড্রয়েড টিভিতে Google সহকারীকে আহ্বান করে এবং "ক্যাপশন সক্ষম করুন" বলে এটি পরীক্ষা করতে পারেন। এটি কীভাবে আপনার কোডে কল করে তা দেখতে বার্তাগুলির জন্য Logcat চেক করুন৷
6. অভিনন্দন
অভিনন্দন, আপনি সফলভাবে নমুনায় মিডিয়া সেশন যোগ করেছেন!
আপনি এর দ্বারা প্রচুর পরিমাণে কার্যকারিতা পেয়েছেন:
- একটি মিডিয়া সেশন যোগ করা,
- ExoPlayer এর একটি উদাহরণে মিডিয়া সেশন সংযোগ করা,
- মেটাডেটা এবং অতিরিক্ত কর্ম যোগ করা।
আপনি এখন একটি মিডিয়া অ্যাপকে সমৃদ্ধ করতে এবং ব্যবহারকারীদের আরও বহুমুখী অভিজ্ঞতা দেওয়ার জন্য প্রয়োজনীয় মূল পদক্ষেপগুলি জানেন!
একটি চূড়ান্ত মন্তব্য
এই কোডল্যাবটি ExoPlayer সোর্স কোড থেকে একটি নমুনার উপরে তৈরি করা হয়েছিল। উত্স থেকে ExoPlayer ব্যবহার করার কোন প্রয়োজন নেই, এবং এটি সুপারিশ করা হচ্ছে যে আপনি পরিবর্তে ExoPlayer এবং MediaSessionConnector-এর জন্য নির্ভরতাগুলি টানুন যাতে সাম্প্রতিক রিলিজের সাথে আপ টু ডেট থাকা সহজ হয়৷
এটি করার জন্য, কেবল প্রকল্প নির্ভরতাগুলি প্রতিস্থাপন করুন যেমন:
implementation project(modulePrefix + 'library-core')
implementation project(path: ':extension-mediasession')
Maven সংগ্রহস্থল থেকে টানতে, যেমন:
implementation 'com.google.android.exoplayer:exoplayer-core:2.+'
implementation 'com.google.android.exoplayer:extension-mediasession:2.+'