ExoPlayer-এর প্রধান ডেমো অ্যাপটি দুটি মূল উদ্দেশ্য পূরণ করে:
- ExoPlayer ব্যবহারের একটি পূর্ণাঙ্গ উদাহরণ দেওয়ার জন্য। এই ডেমো অ্যাপটি আপনার নিজের অ্যাপ তৈরি করার জন্য একটি সুবিধাজনক সূচনা বিন্দু হিসেবে ব্যবহার করা যেতে পারে।
- আপনাকে ExoPlayer পরখ করে দেখার সুযোগ দিতে। এই ডেমো অ্যাপটি অন্তর্ভুক্ত স্যাম্পলগুলোর পাশাপাশি আপনার নিজের কন্টেন্টের প্লেব্যাক পরীক্ষা করার জন্যও ব্যবহার করা যেতে পারে।
এই পৃষ্ঠায় ডেমো অ্যাপটি কীভাবে পেতে, কম্পাইল করতে এবং চালাতে হয় তা বর্ণনা করা হয়েছে। এটি ব্যবহার করে কীভাবে আপনার নিজের মিডিয়া চালাতে হয়, তাও বর্ণনা করা হয়েছে।
কোডটি পাওয়া
মূল ডেমো অ্যাপটির সোর্স কোড আমাদের গিটহাব প্রজেক্টের demos/main ফোল্ডারে পাওয়া যাবে। আপনি যদি এখনও তা না করে থাকেন, তাহলে প্রজেক্টটি আপনার স্থানীয় কোনো ডিরেক্টরিতে ক্লোন করুন:
git clone https://github.com/androidx/media.git
এরপর, অ্যান্ড্রয়েড স্টুডিওতে প্রজেক্টটি খুলুন। অ্যান্ড্রয়েড প্রজেক্ট ভিউতে আপনি নিম্নলিখিতটি দেখতে পাবেন (ডেমো অ্যাপের প্রাসঙ্গিক ফোল্ডারগুলো এক্সপ্যান্ড করা হয়েছে):

সংকলন এবং চালানো
ডেমো অ্যাপটি কম্পাইল ও রান করার জন্য, অ্যান্ড্রয়েড স্টুডিওতে demo কনফিগারেশনটি নির্বাচন করে চালান। ডেমো অ্যাপটি একটি সংযুক্ত অ্যান্ড্রয়েড-চালিত ডিভাইসে ইনস্টল ও রান হবে। সম্ভব হলে আমরা একটি ফিজিক্যাল ডিভাইস ব্যবহার করার পরামর্শ দিই। এর পরিবর্তে যদি আপনি একটি এমুলেটর ব্যবহার করতে চান, তবে ‘সমর্থিত ডিভাইস’ (Supported devices) অংশের এমুলেটর বিভাগটি পড়ুন এবং নিশ্চিত করুন যে আপনার ভার্চুয়াল ডিভাইসটি কমপক্ষে ২৩ এপিআই লেভেলের একটি সিস্টেম ইমেজ ব্যবহার করছে।

ডেমো অ্যাপটি স্যাম্পলের একটি তালিকা ( SampleChooserActivity ) প্রদর্শন করে। একটি স্যাম্পল নির্বাচন করলে প্লেব্যাকের জন্য একটি দ্বিতীয় অ্যাক্টিভিটি ( PlayerActivity ) খুলবে। ডেমোটিতে প্লেব্যাক কন্ট্রোল এবং ট্র্যাক নির্বাচনের কার্যকারিতা রয়েছে। এটি সিস্টেম লগে দরকারি ডিবাগ তথ্য আউটপুট করার জন্য ExoPlayer-এর EventLogger ইউটিলিটি ক্লাসও ব্যবহার করে। এই লগিং (অন্যান্য ট্যাগের জন্য এরর লেভেল লগিং সহ) নিম্নলিখিত কমান্ডের মাধ্যমে দেখা যেতে পারে:
adb logcat EventLogger:V *:E
বান্ডেল ডিকোডার সক্রিয় করা
ExoPlayer-এর বেশ কিছু এক্সটেনশন রয়েছে যা বান্ডেল করা সফটওয়্যার ডিকোডার, যেমন—AV1, VP9, Opus, FLAC, এবং FFmpeg (শুধুমাত্র অডিও) ব্যবহারের সুযোগ দেয়। এই এক্সটেনশনগুলো অন্তর্ভুক্ত ও ব্যবহার করার জন্য ডেমো অ্যাপটি নিম্নোক্তভাবে তৈরি করা যেতে পারে:
- আপনি যে এক্সটেনশনগুলো অন্তর্ভুক্ত করতে চান, তার প্রত্যেকটি তৈরি করুন। মনে রাখবেন, এটি একটি ম্যানুয়াল প্রক্রিয়া। নির্দেশাবলীর জন্য প্রতিটি এক্সটেনশনের
README.mdফাইলটি দেখুন। অ্যান্ড্রয়েড স্টুডিও-এর 'Build Variants' ভিউতে, নিচের ছবিতে দেখানো অনুযায়ী ডেমো মডিউলটির বিল্ড ভ্যারিয়েন্ট
withDecoderExtensionsDebugঅথবাwithDecoderExtensionsReleaseএ সেট করুন।
স্বাভাবিকভাবে
demoকনফিগারেশনটি কম্পাইল, ইনস্টল এবং রান করুন।
ডিফল্টরূপে, শুধুমাত্র উপযুক্ত প্ল্যাটফর্ম ডিকোডার না থাকলে একটি এক্সটেনশন ডিকোডার ব্যবহার করা হবে। নিম্নলিখিত বিভাগগুলিতে বর্ণিত পদ্ধতি অনুযায়ী, এক্সটেনশন ডিকোডারকে অগ্রাধিকার দেওয়ার বিষয়টি নির্দিষ্ট করা সম্ভব।
আপনার নিজের কন্টেন্ট চালানো
ডেমো অ্যাপে আপনার নিজের কন্টেন্ট চালানোর একাধিক উপায় রয়েছে।
১. assets/media.exolist.json সম্পাদনা করা
ডেমো অ্যাপে তালিকাভুক্ত স্যাম্পলগুলো assets/media.exolist.json থেকে লোড করা হয়। এই JSON ফাইলটি সম্পাদনা করে ডেমো অ্যাপে স্যাম্পল যোগ এবং অপসারণ করা যায়। স্কিমাটি নিম্নরূপ, যেখানে [O] একটি ঐচ্ছিক অ্যাট্রিবিউট নির্দেশ করে।
[
{
"name": "Name of heading",
"samples": [
{
"name": "Name of sample",
"uri": "The URI of the sample",
"extension": "[O] Sample type hint. Cannot be combined with mime_type. Values: mpd, ism, m3u8",
"clip_start_position_ms": "[O] A start point to which the sample should be clipped, in milliseconds"
"clip_end_position_ms": "[O] An end point from which the sample should be clipped, in milliseconds"
"drm_scheme": "[O] Drm scheme if protected. Values: widevine, playready, clearkey",
"drm_license_uri": "[O] URI of the license server if protected",
"drm_force_default_license_uri": "[O] Whether to force use of "drm_license_uri" for key requests that include their own license URI",
"drm_key_request_properties": "[O] Key request headers if protected",
"drm_session_for_clear_content": "[O] Whether to attach a DRM session to clear video and audio tracks"
"drm_multi_session": "[O] Enables key rotation if protected",
"mime_type": "[O] The MIME type of the sample. Cannot be combined with extension.",
"subtitle_uri": "[O] The URI of a subtitle sidecar file",
"subtitle_mime_type": "[O] The MIME type of subtitle_uri (required if subtitle_uri is set)",
"subtitle_language": "[O] The BCP47 language code of the subtitle file (ignored if subtitle_uri is not set)",
"ad_tag_uri": "[O] The URI of an ad tag to load via the IMA extension"
},
...etc
]
},
...etc
]
নিম্নলিখিত স্কিমা ব্যবহার করে স্যাম্পলের প্লেলিস্ট নির্দিষ্ট করা যেতে পারে:
[
{
"name": "Name of heading",
"samples": [
{
"name": "Name of playlist sample",
"playlist": [
{
"uri": "The URI of the first sample in the playlist",
"extension": "[O] Sample type hint. Cannot be combined with mime_type. Values: mpd, ism, m3u8"
"clip_start_position_ms": "[O] A start point to which the sample should be clipped, in milliseconds"
"clip_end_position_ms": "[O] An end point from which the sample should be clipped, in milliseconds"
"drm_scheme": "[O] Drm scheme if protected. Values: widevine, playready, clearkey",
"drm_license_uri": "[O] URI of the license server if protected",
"drm_force_default_license_uri": "[O] Whether to force use of "drm_license_uri" for key requests that include their own license URI",
"drm_key_request_properties": "[O] Key request headers if protected",
"drm_session_for_clear_content": "[O] Whether to attach a DRM session to clear video and audio tracks",
"drm_multi_session": "[O] Enables key rotation if protected",
"mime_type": "[O] The MIME type of the sample. Cannot be combined with extension.",
"subtitle_uri": "[O] The URI of a subtitle sidecar file",
"subtitle_mime_type": "[O] The MIME type of subtitle_uri (required if subtitle_uri is set)",
"subtitle_language": "[O] The BCP47 language code of the subtitle file (ignored if subtitle_uri is not set)"
},
{
"uri": "The URI of the second sample in the playlist",
...etc
},
...etc
]
},
...etc
]
},
...etc
]
প্রয়োজন হলে, মূল অনুরোধ হেডারগুলো একটি অবজেক্ট হিসেবে নির্দিষ্ট করা হয়, যেখানে প্রতিটি হেডারের জন্য একটি স্ট্রিং অ্যাট্রিবিউট থাকে:
"drm_key_request_properties": {
"name1": "value1",
"name2": "value2",
...etc
}
স্যাম্পল চুজার অ্যাক্টিভিটিতে, ওভারফ্লো মেনুতে এক্সটেনশন ডিকোডারকে অগ্রাধিকার দেওয়া হবে কিনা তা নির্দিষ্ট করার জন্য অপশন রয়েছে।
স্থানীয় ফাইল ইউআরআই এবং স্কোপড স্টোরেজ সীমাবদ্ধতা
স্থানীয় ফাইল URI নির্দিষ্ট করার সময়, ডেমো অ্যাপটি এই ফাইলগুলি পড়ার জন্য প্রয়োজনীয় স্টোরেজ অ্যাক্সেসের অনুমতি চেয়ে থাকে। তবে, অ্যান্ড্রয়েড ১৩ থেকে, যেসব ফাইলের শেষে সাধারণ মিডিয়া ফাইল এক্সটেনশন (যেমন .mp4 ) নেই, সেসব ফাইল লোড করা সম্ভব নয়। যদি আপনার এই ধরনের কোনো ফাইল লোড করার প্রয়োজন হয়, তবে আপনি সেটিকে ডেমো অ্যাপের নির্দিষ্ট স্টোরেজ ডিরেক্টরিতে রাখতে পারেন, যেখানে অ্যাক্সেসের কোনো সীমাবদ্ধতা নেই। এটি সাধারণত /sdcard/Android/data/androidx.media3.demo.main/files -এ অবস্থিত।
২. একটি বাহ্যিক exolist.json ফাইল লোড করা
ডেমো অ্যাপটি পূর্বোক্ত স্কিমা ব্যবহার করে এবং *.exolist.json রীতি অনুসারে নামকরণ করা বাহ্যিক JSON ফাইল লোড করতে পারে। উদাহরণস্বরূপ, যদি আপনি https://yourdomain.com/samples.exolist.json এ এই ধরনের একটি ফাইল হোস্ট করেন, তাহলে আপনি এটি ডেমো অ্যাপে নিম্নলিখিতভাবে খুলতে পারেন:
adb shell am start -a android.intent.action.VIEW \
-d https://yourdomain.com/samples.exolist.json
যে ডিভাইসে ডেমো অ্যাপ ইনস্টল করা আছে, সেখানে একটি *.exolist.json লিঙ্কে ক্লিক করলে (উদাহরণস্বরূপ, ব্রাউজারে বা ইমেল ক্লায়েন্টে) সেটি ডেমো অ্যাপেও খুলে যাবে। একটি *.exolist.json JSON ফাইল হোস্ট করার মাধ্যমে অন্যদের ডেমো অ্যাপে কন্টেন্ট পরীক্ষা করার সুযোগ দেওয়া যায়।
৩. একটি অভিপ্রায় কার্যকর করা
স্যাম্পলের তালিকা এড়িয়ে সরাসরি প্লেব্যাক শুরু করতে ইন্টেন্ট ব্যবহার করা যায়। একটিমাত্র স্যাম্পল প্লে করার জন্য, ইন্টেন্টটির অ্যাকশন androidx.media3.demo.main.action.VIEW তে এবং এর ডেটা ইউআরআই (data URI) হিসেবে যে স্যাম্পলটি প্লে করতে চান সেটির ডেটা ইউআরআই সেট করুন। এই ধরনের একটি ইন্টেন্ট টার্মিনাল থেকে নিম্নলিখিত কমান্ড ব্যবহার করে চালু করা যেতে পারে:
adb shell am start -a androidx.media3.demo.main.action.VIEW \
-d https://yourdomain.com/sample.mp4
একটি একক স্যাম্পল ইন্টেন্টের জন্য সমর্থিত ঐচ্ছিক অতিরিক্ত বিষয়গুলো হলো:
- নমুনা কনফিগারেশনের অতিরিক্ত অংশ:
-
mime_type[String] নমুনা MIME টাইপ ইঙ্গিত। উদাহরণস্বরূপ, DASH কন্টেন্টের জন্যapplication/dash+xml। -
clip_start_position_ms[দীর্ঘ] একটি শুরুর বিন্দু, যেখান থেকে স্যাম্পলটি ক্লিপ করা হবে, মিলিসেকেন্ডে। -
clip_end_position_ms[দীর্ঘ] একটি শেষবিন্দু যেখান থেকে স্যাম্পলটি ক্লিপ করা হবে, মিলিসেকেন্ডে। -
drm_scheme[স্ট্রিং] ডিআরএম স্কিম, যদি সুরক্ষিত থাকে। বৈধ মানগুলি হলোwidevine,playreadyএবংclearkey। ডিআরএম স্কিম UUID-ও গ্রহণ করা হয়। -
drm_license_uri[String] লাইসেন্স সার্ভারের URI, যদি সুরক্ষিত থাকে। -
drm_force_default_license_uri[বুলিয়ান] যেসব কী রিকোয়েস্টে তাদের নিজস্ব লাইসেন্স ইউআরআই অন্তর্ভুক্ত থাকে, সেগুলোর জন্যdrm_license_uriব্যবহার বাধ্যতামূলক করা হবে কিনা। -
drm_key_request_properties[স্ট্রিং অ্যারে] সুরক্ষিত থাকলে, মূল অনুরোধ হেডারগুলো name1, value1, name2, value2 ইত্যাদি হিসেবে প্যাক করা থাকে। - [
drm_session_for_clear_content] ভিডিও এবং অডিও ট্র্যাক পরিষ্কার করার জন্য একটি ডিআরএম সেশন সংযুক্ত করা হবে কিনা। -
drm_multi_session[বুলিয়ান] সুরক্ষিত থাকলে কী রোটেশন সক্ষম করে। -
subtitle_uri[স্ট্রিং] একটি সাবটাইটেল সাইডকার ফাইলের URI। -
subtitle_mime_type[String] subtitle_uri-এর MIME টাইপ (যদি subtitle_uri সেট করা থাকে তবে এটি আবশ্যক)। -
subtitle_language[String] সাবটাইটেল ফাইলের BCP47 ভাষা কোড (যদি subtitle_uri সেট করা না থাকে তবে এটি উপেক্ষা করা হবে)। -
ad_tag_uri[স্ট্রিং] IMA এক্সটেনশন ব্যবহার করে লোড করার জন্য একটি বিজ্ঞাপন ট্যাগের URI। -
prefer_extension_decoders[বুলিয়ান] প্ল্যাটফর্ম ডিকোডারের চেয়ে এক্সটেনশন ডিকোডারকে অগ্রাধিকার দেওয়া হবে কিনা।
-
adb shell am start ব্যবহার করে একটি ইন্টেন্ট ফায়ার করার সময়, --es দিয়ে একটি ঐচ্ছিক স্ট্রিং এক্সট্রা সেট করা যেতে পারে (যেমন, --es extension mpd )। --ez দিয়ে একটি ঐচ্ছিক বুলিয়ান এক্সট্রা সেট করা যেতে পারে (যেমন, --ez prefer_extension_decoders TRUE )। --el দিয়ে একটি ঐচ্ছিক লং এক্সট্রা সেট করা যেতে পারে (যেমন, --el clip_start_position_ms 5000 )। --esa দিয়ে একটি ঐচ্ছিক স্ট্রিং অ্যারে এক্সট্রা সেট করা যেতে পারে (যেমন, --esa drm_key_request_properties name1,value1 )।
স্যাম্পলের একটি প্লেলিস্ট প্লে করতে, ইন্টেন্টের অ্যাকশনটি androidx.media3.demo.main.action.VIEW_LIST এ সেট করুন। স্যাম্পল কনফিগারেশন এক্সট্রাগুলো androidx.media3.demo.main.action.VIEW এর মতোই থাকে, তবে দুটি পার্থক্য রয়েছে:
- এক্সট্রাস কী-গুলোর সাফিক্স হিসেবে একটি আন্ডারস্কোর এবং স্যাম্পলের ০-ভিত্তিক ইনডেক্স থাকা উচিত। উদাহরণস্বরূপ,
extension_0প্রথম স্যাম্পলের ধরন সম্পর্কে ইঙ্গিত দেবে।drm_scheme_1দ্বিতীয় স্যাম্পলের জন্য ডিআরএম স্কিম নির্ধারণ করবে। - স্যাম্পলটির ইউআরআই (uri)
uri_<sample-index>কী-এর মাধ্যমে একটি এক্সট্রা হিসেবে পাস করা হয়।
অন্যান্য অতিরিক্ত বিষয়, যেগুলো স্যাম্পলের উপর নির্ভরশীল নয়, সেগুলো অপরিবর্তিত থাকে। উদাহরণস্বরূপ, আপনি টার্মিনালে নিম্নলিখিত কমান্ডটি চালিয়ে দুটি আইটেমসহ একটি প্লেলিস্ট চালাতে পারেন, যা দ্বিতীয় আইটেমটির এক্সটেনশনকে ওভাররাইড করবে:
adb shell am start -a androidx.media3.demo.main.action.VIEW_LIST \
--es uri_0 https://a.com/sample1.mp4 \
--es uri_1 https://b.com/sample2.fake_mpd \
--es extension_1 mpd