ExoPlayer একাধিক কন্টেইনার ফরম্যাট সহ DASH সমর্থন করে। মিডিয়া স্ট্রিমগুলোকে অবশ্যই ডিমাক্সড হতে হবে, যার অর্থ হলো DASH ম্যানিফেস্টে ভিডিও, অডিও এবং টেক্সটকে অবশ্যই স্বতন্ত্র AdaptationSet এলিমেন্টে সংজ্ঞায়িত করতে হবে (নিচের টেবিলে বর্ণিত CEA-608 একটি ব্যতিক্রম)। এর অন্তর্ভুক্ত অডিও এবং ভিডিও স্যাম্পল ফরম্যাটগুলোও অবশ্যই সমর্থিত হতে হবে (বিস্তারিত জানার জন্য স্যাম্পল ফরম্যাট বিভাগটি দেখুন)।
| বৈশিষ্ট্য | সমর্থিত | মন্তব্য |
|---|---|---|
| কন্টেইনার | ||
| এফএমপি৪ | হ্যাঁ | শুধুমাত্র ডিমাক্স করা স্ট্রিম |
| ওয়েবএম | হ্যাঁ | শুধুমাত্র ডিমাক্স করা স্ট্রিম |
| ম্যাট্রোস্কা | হ্যাঁ | শুধুমাত্র ডিমাক্স করা স্ট্রিম |
| এমপিইজি-টিএস | না | কোনো সহায়তার পরিকল্পনা নেই |
| ক্লোজড ক্যাপশন / সাবটাইটেল | ||
| টিটিএমএল | হ্যাঁ | ISO/IEC 14496-30 অনুযায়ী কাঁচা, অথবা FMP4-এ অন্তর্নিহিত। |
| ওয়েবভিটিটি | হ্যাঁ | ISO/IEC 14496-30 অনুযায়ী কাঁচা, অথবা FMP4-এ অন্তর্নিহিত। |
| সিইএ-৬০৮ | হ্যাঁ | SCTE অ্যাক্সেসিবিলিটি বর্ণনাকারী ব্যবহার করে সংকেত দেওয়া হলে FMP4-এ অন্তর্ভুক্ত থাকে |
| সিইএ-৭০৮ | হ্যাঁ | SCTE অ্যাক্সেসিবিলিটি বর্ণনাকারী ব্যবহার করে সংকেত দেওয়া হলে FMP4-এ অন্তর্ভুক্ত থাকে |
| মেটাডেটা | ||
| EMSG মেটাডেটা | হ্যাঁ | FMP4-এ এমবেড করা |
| বিষয়বস্তু সুরক্ষা | ||
| ওয়াইডভাইন | হ্যাঁ | "cenc" স্কিম: এপিআই ১৯+; "cbcs" স্কিম: এপিআই ২৫+ |
| প্লে রেডি এসএল২০০০ | হ্যাঁ | অ্যান্ড্রয়েড টিভি, শুধুমাত্র "cenc" স্কিম |
| ক্লিয়ারকি | হ্যাঁ | শুধুমাত্র API 21+, "cenc" স্কিম |
| বিজ্ঞাপন সন্নিবেশ | ||
| বহু-পর্যায় প্লেব্যাক | হ্যাঁ | |
| সার্ভার-নির্দেশিত বিজ্ঞাপন সন্নিবেশ (xlinks) | না | |
| আইএমএ সার্ভার-সাইড এবং ক্লায়েন্ট-সাইড বিজ্ঞাপন | হ্যাঁ | বিজ্ঞাপন সন্নিবেশ নির্দেশিকা |
| লাইভ প্লেব্যাক | ||
| নিয়মিত লাইভ প্লেব্যাক | হ্যাঁ | |
| অত্যন্ত কম ল্যাটেন্সি CMAF লাইভ প্লেব্যাক | হ্যাঁ | |
| কমন মিডিয়া ক্লায়েন্ট ডেটা (সিএমসিডি) | হ্যাঁ | সিএমসিডি একীকরণ নির্দেশিকা |
মিডিয়াআইটেম ব্যবহার করে
একটি ড্যাশ স্ট্রিম চালাতে হলে, আপনাকে ড্যাশ মডিউলের উপর নির্ভর করতে হবে।
কোটলিন
implementation("androidx.media3:media3-exoplayer-dash:1.10.0")
গ্রুভি
implementation "androidx.media3:media3-exoplayer-dash:1.10.0"
এরপর আপনি একটি DASH MPD URI-এর জন্য একটি MediaItem তৈরি করে সেটি প্লেয়ারে পাঠাতে পারবেন।
কোটলিন
// 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 না থাকে, তাহলে কন্টেন্টের ধরণ স্পষ্টভাবে নির্দেশ করার জন্য আপনি MediaItem.Builder এর setMimeType এ MimeTypes.APPLICATION_MPD পাস করতে পারেন।
ExoPlayer উপলব্ধ ব্যান্ডউইথ এবং ডিভাইসের সক্ষমতা উভয়ই বিবেচনা করে, ম্যানিফেস্টে সংজ্ঞায়িত উপস্থাপনাগুলোর মধ্যে স্বয়ংক্রিয়ভাবে মানিয়ে নেবে।
ড্যাশমিডিয়াসোর্স ব্যবহার করে
আরও কাস্টমাইজেশন বিকল্পের জন্য, আপনি একটি MediaItem এর পরিবর্তে একটি DashMediaSource তৈরি করে সরাসরি প্লেয়ারে পাঠাতে পারেন।
কোটলিন
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 কলব্যাকটিও কল করা হয়। অন-ডিমান্ড কন্টেন্টের জন্য এটি একবার ঘটবে, এবং লাইভ কন্টেন্টের জন্য সম্ভবত অনেকবার ঘটবে। নিচের কোড স্নিপেটটি দেখায় যে, ম্যানিফেস্ট লোড হওয়ার সাথে সাথে একটি অ্যাপ কীভাবে কোনো কাজ করতে পারে।
কোটলিন
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 আপনার অ্যাপের প্রয়োজন অনুযায়ী প্লেব্যাক অভিজ্ঞতা সাজিয়ে নেওয়ার জন্য একাধিক উপায় প্রদান করে। উদাহরণের জন্য কাস্টমাইজেশন পৃষ্ঠাটি দেখুন।