ExoPlayer একাধিক কন্টেনার ফর্ম্যাটের সাথে DASH সাপোর্ট করে। মিডিয়া স্ট্রিম ডিমাক্সড হতে হবে, অর্থাৎ ভিডিও, অডিও ও টেক্সট DASH ম্যানিফেস্টে আলাদা
AdaptationSet এলিমেন্টে উল্লেখ করতে হবে (CEA-608 ব্যতিক্রম, নিচের সারণীতে যেমন উল্লেখ করা হয়েছে)। এছাড়াও, এর মধ্যে থাকা অডিও ও ভিডিও স্যাম্পেল ফর্ম্যাটও
কাজ করতে হবে (বিস্তারিত জানতে
স্যাম্পেল ফর্ম্যাট বিভাগ দেখুন)।
| ফিচার | কাজ করে | কমেন্ট |
|---|---|---|
| কন্টেনার | ||
| FMP4 | হ্যাঁ | শুধুমাত্র ডিমাক্সড স্ট্রিম |
| WebM | হ্যাঁ | শুধুমাত্র ডিমাক্সড স্ট্রিম |
| Matroska | হ্যাঁ | শুধুমাত্র ডিমাক্সড স্ট্রিম |
| MPEG-TS | না | কোনও সহায়তা প্ল্যান করা হয়নি |
| ক্লোজড ক্যাপশন / সাবটাইটেল | ||
| TTML | হ্যাঁ | ISO/IEC 14496-30 অনুযায়ী র বা FMP4-এ এম্বেড করা |
| WebVTT | হ্যাঁ | ISO/IEC 14496-30 অনুযায়ী র বা FMP4-এ এম্বেড করা |
| CEA-608 | হ্যাঁ | SCTE অ্যাক্সেসিবিলিটি ডেসক্রিপ্টর ব্যবহার করে সিগন্যাল করা হলে FMP4-এ এম্বেড করা হয় |
| CEA-708 | হ্যাঁ | SCTE অ্যাক্সেসিবিলিটি ডেসক্রিপ্টর ব্যবহার করে সিগন্যাল করা হলে FMP4-এ এম্বেড করা হয় |
| মেটাডেটা | ||
| EMSG মেটাডেটা | হ্যাঁ | FMP4-এ এম্বেড করা আছে |
| কন্টেন্ট সুরক্ষা | ||
| Widevine | হ্যাঁ | "cenc" স্কিম: API 19+; "cbcs" স্কিম: API 25+ |
| PlayReady SL2000 | হ্যাঁ | Android TV, শুধুমাত্র "cenc" স্কিম |
| ClearKey | হ্যাঁ | API 21+, শুধুমাত্র "cenc" স্কিম |
| বিজ্ঞাপন যোগ করা | ||
| মাল্টি-পিরিয়ড প্লেব্যাক | হ্যাঁ | |
| সার্ভার-গাইডেড বিজ্ঞাপন যোগ করা (xlinks) | না | |
| IMA সার্ভার-সাইড এবং ক্লায়েন্ট-সাইড বিজ্ঞাপন | হ্যাঁ | বিজ্ঞাপন যোগ করার নির্দেশিকা |
| লাইভ প্লেব্যাক | ||
| নিয়মিত লাইভ প্লেব্যাক | হ্যাঁ | |
| আল্ট্রা লো-লেটেন্সি CMAF লাইভ প্লেব্যাক | হ্যাঁ | |
| কমন মিডিয়া ক্লায়েন্ট ডেটা (CMCD) | হ্যাঁ | CMCD ইন্টিগ্রেশন সংক্রান্ত নির্দেশিকা |
MediaItem ব্যবহার করা
DASH স্ট্রিম চালাতে, আপনাকে DASH মডিউলের উপর নির্ভর করতে হবে।
Kotlin
implementation("androidx.media3:media3-exoplayer-dash:1.11.1")
গ্ৰুভি
implementation "androidx.media3:media3-exoplayer-dash:1.11.1"
তারপর আপনি DASH MPD URI-এর জন্য MediaItem তৈরি করে প্লেয়ারে পাস করতে পারবেন।
Kotlin
// Create a player instance. val player = ExoPlayer.Builder(context).build() // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(dashUri)) // Prepare the player. player.prepare()
জাভা
// Create a player instance. ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(dashUri)); // Prepare the player. player.prepare();
আপনার URI .mpd দিয়ে শেষ না হলে, আপনি MimeTypes.APPLICATION_MPD
MediaItem.Builder-এর setMimeType-এ পাস করতে পারেন যাতে কন্টেন্টের ধরন স্পষ্টভাবে
বোঝা যায়।
ExoPlayer অটোমেটিক ম্যানিফেস্টে উল্লেখ করা রিপ্রেজেন্টেশনের মধ্যে অ্যাডাপ্ট করে নেবে, এক্ষেত্রে উপলভ্য ব্যান্ডউইথ ও ডিভাইসের ক্ষমতা, দুটিই বিবেচনা করা হবে।
DashMediaSource ব্যবহার করা
আরও কাস্টমাইজেশন বিকল্পের জন্য, আপনি একটি DashMediaSource তৈরি করতে পারেন এবং এটি সরাসরি প্লেয়ারে পাস করতে পারেন
MediaItem-এর পরিবর্তে।
Kotlin
val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory() // Create a dash media source pointing to a dash manifest uri. val mediaSource: MediaSource = DashMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(dashUri)) // Create a player instance which gets an adaptive track selector by default. val player = ExoPlayer.Builder(context).build() // Set the media source to be played. player.setMediaSource(mediaSource) // Prepare the player. player.prepare()
জাভা
DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory(); // Create a dash media source pointing to a dash manifest uri. MediaSource mediaSource = new DashMediaSource.Factory(dataSourceFactory) .createMediaSource(MediaItem.fromUri(dashUri)); // Create a player instance which gets an adaptive track selector by default. ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media source to be played. player.setMediaSource(mediaSource); // Prepare the player. player.prepare();
ম্যানিফেস্ট অ্যাক্সেস করা
Player.getCurrentManifest-এ কল করে আপনি বর্তমান ম্যানিফেস্ট ফিরিয়ে আনতে পারবেন।
DASH-এর জন্য আপনাকে রিটার্ন করা অবজেক্ট DashManifest-এ কাস্ট করতে হবে। এছাড়াও, ম্যানিফেস্ট লোড করা হলে,
Player.Listener-এর onTimelineChanged কলব্যাককে কল করা হয়। এটি অন-ডিমান্ড কন্টেন্টের জন্য একবার এবং
সম্ভবত লাইভ কন্টেন্টের জন্য অনেকবার ঘটবে। নিম্নলিখিত কোড স্নিপেট থেকে বোঝা যায় যে ম্যানিফেস্ট লোড হওয়ার সময়
অ্যাপ কীভাবে কাজ করে।
Kotlin
player.addListener( object : Player.Listener { override fun onTimelineChanged( timeline: Timeline, @Player.TimelineChangeReason reason: Int, ) { val manifest = player.currentManifest if (manifest is DashManifest) { // Do something with the manifest. } } } )
জাভা
player.addListener( new Player.Listener() { @Override public void onTimelineChanged( Timeline timeline, @Player.TimelineChangeReason int reason) { Object manifest = player.getCurrentManifest(); if (manifest != null) { DashManifest dashManifest = (DashManifest) manifest; // Do something with the manifest. } } });
প্লেব্যাক কাস্টমাইজ করা
ExoPlayer আপনার অ্যাপের প্রয়োজন অনুযায়ী প্লেব্যাক অভিজ্ঞতা কাস্টমাইজ করার জন্য একাধিক উপায় প্রদান করে। উদাহরণ দেখতে কাস্টমাইজেশন পৃষ্ঠা দেখুন।