প্লেলিস্ট APIটি MediaItem ইনস্ট্যান্সের উপর ভিত্তি করে তৈরি, যা MediaItem.Builder ব্যবহার করে সুবিধাজনকভাবে তৈরি করা যেতে পারে। প্লেয়ারের ভিতরে, একটি MediaItem MediaSource.Factory দ্বারা প্লেযোগ্য MediaSource এ রূপান্তরিত করা হয়। কাস্টম কনফিগারেশন ছাড়াই, এই রূপান্তরটি একটি DefaultMediaSourceFactory দ্বারা সম্পন্ন হয়, যা মিডিয়া আইটেমের বৈশিষ্ট্যের সাথে সম্পর্কিত জটিল মিডিয়া উত্স তৈরি করতে সক্ষম। মিডিয়া আইটেমগুলিতে সেট করা যেতে পারে এমন কিছু বৈশিষ্ট্য নীচে বর্ণিত হয়েছে।
সহজ মিডিয়া আইটেম
শুধুমাত্র স্ট্রিম URI সমন্বিত একটি মিডিয়া আইটেম fromUri সুবিধা পদ্ধতি ব্যবহার করে তৈরি করা যেতে পারে:
কোটলিন
val mediaItem = MediaItem.fromUri(videoUri)
জাভা
MediaItem mediaItem = MediaItem.fromUri(videoUri);
অন্যান্য সকল ক্ষেত্রে, একটি MediaItem.Builder ব্যবহার করা যেতে পারে। নিম্নলিখিত উদাহরণে, একটি মিডিয়া আইটেম একটি আইডি এবং কিছু সংযুক্ত মেটাডেটা দিয়ে তৈরি করা হয়েছে:
কোটলিন
val mediaItem = MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build()
জাভা
MediaItem mediaItem = new MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build();
প্লেলিস্ট ট্রানজিশনের সময় আপনার অ্যাপের UI আপডেট করার জন্য মেটাডেটা সংযুক্ত করা কার্যকর হতে পারে।
ছবি
ছবি প্লেব্যাকের জন্য মিডিয়া আইটেমে একটি সময়কাল প্রয়োজন যাতে প্লেব্যাকের সময় ছবিটি কতক্ষণ দেখানো হবে তা নির্দিষ্ট করা যায়। মোশন ফটো এবং ইমেজ লোডিং লাইব্রেরি (উদাহরণস্বরূপ, গ্লাইড) সম্পর্কে আরও তথ্যের জন্য ইমেজ গাইড পৃষ্ঠাটি দেখুন।
কোটলিন
val mediaItem = MediaItem.Builder().setUri(imageUri).setImageDurationMs(3000).build()
জাভা
MediaItem mediaItem = new MediaItem.Builder().setUri(imageUri).setImageDurationMs(3_000).build();
অভিযোজিত মিডিয়ার জন্য অ-মানক ফাইল এক্সটেনশন
ExoPlayer DASH, HLS এবং SmoothStreaming এর জন্য অ্যাডাপ্টিভ মিডিয়া সোর্স প্রদান করে। যদি এই ধরনের অ্যাডাপ্টিভ মিডিয়া আইটেমের URI একটি স্ট্যান্ডার্ড ফাইল এক্সটেনশন দিয়ে শেষ হয়, তাহলে সংশ্লিষ্ট মিডিয়া সোর্সটি স্বয়ংক্রিয়ভাবে তৈরি হয়ে যায়। যদি URI তে একটি নন-স্ট্যান্ডার্ড এক্সটেনশন থাকে বা কোনও এক্সটেনশন না থাকে, তাহলে মিডিয়া আইটেমের ধরণ নির্দেশ করার জন্য MIME টাইপ স্পষ্টভাবে সেট করা যেতে পারে:
কোটলিন
val mediaItem = MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build()
জাভা
MediaItem mediaItem = new MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build();
প্রগতিশীল মিডিয়া স্ট্রিমগুলির জন্য MIME টাইপের প্রয়োজন নেই।
সুরক্ষিত কন্টেন্ট
সুরক্ষিত কন্টেন্টের জন্য, মিডিয়া আইটেমের DRM বৈশিষ্ট্য সেট করা উচিত। UUID প্রয়োজন, অন্যান্য সমস্ত বৈশিষ্ট্য ঐচ্ছিক।
Widevine DRM দ্বারা সুরক্ষিত একটি আইটেম চালানোর জন্য একটি উদাহরণ কনফিগারেশন যেখানে লাইসেন্স URI সরাসরি মিডিয়াতে উপলব্ধ নয় (যেমন DASH প্লেলিস্টে) এবং একাধিক সেশন প্রয়োজন (যেমন কী ঘূর্ণনের কারণে):
কোটলিন
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setDrmConfiguration( MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) .setLicenseUri(licenseUri) .setMultiSession(true) .setLicenseRequestHeaders(httpRequestHeaders) .build() ) .build()
জাভা
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setDrmConfiguration( new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) .setLicenseUri(licenseUri) .setMultiSession(true) .setLicenseRequestHeaders(httpRequestHeaders) .build()) .build();
প্লেয়ারের ভেতরে, DefaultMediaSourceFactory এই বৈশিষ্ট্যগুলি একটি DrmSessionManagerProvider কে একটি DrmSessionManager পাওয়ার জন্য প্রেরণ করবে, যা তারপর তৈরি করা MediaSource এ ইনজেক্ট করা হবে। DRM আচরণ আপনার প্রয়োজন অনুসারে আরও কাস্টমাইজ করা যেতে পারে।
সাবটাইটেল ট্র্যাক সাইডলোড করা হচ্ছে
সাবটাইটেল ট্র্যাক সাইডলোড করার জন্য, মিডিয়া আইটেম তৈরি করার সময় MediaItem.Subtitle ইনস্ট্যান্স যোগ করা যেতে পারে:
কোটলিন
val subtitle = MediaItem.SubtitleConfiguration.Builder(subtitleUri) .setMimeType(mimeType) // The correct MIME type (required). .setLanguage(language) // The subtitle language (optional). .setSelectionFlags(selectionFlags) // Selection flags for the track (optional). .build() val mediaItem = MediaItem.Builder().setUri(videoUri).setSubtitleConfigurations(listOf(subtitle)).build()
জাভা
MediaItem.SubtitleConfiguration subtitle = new MediaItem.SubtitleConfiguration.Builder(subtitleUri) .setMimeType(mimeType) // The correct MIME type (required). .setLanguage(language) // The subtitle language (optional). .setSelectionFlags(selectionFlags) // Selection flags for the track (optional). .build(); MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setSubtitleConfigurations(ImmutableList.of(subtitle)) .build();
অভ্যন্তরীণভাবে, DefaultMediaSourceFactory প্রতিটি সাবটাইটেল ট্র্যাকের জন্য একটি SingleSampleMediaSource এর সাথে কন্টেন্ট মিডিয়া সোর্স একত্রিত করার জন্য একটি MergingMediaSource ব্যবহার করবে। DefaultMediaSourceFactory মাল্টি-পিরিয়ড DASH এর জন্য সাইডলোডিং সাবটাইটেল সমর্থন করে না।
একটি মিডিয়া স্ট্রিম ক্লিপ করা হচ্ছে
কোনও মিডিয়া আইটেম দ্বারা উল্লেখিত কন্টেন্ট ক্লিপ করতে, কাস্টম শুরু এবং শেষ অবস্থান সেট করুন:
কোটলিন
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setClippingConfiguration( MediaItem.ClippingConfiguration.Builder() .setStartPositionMs(startPositionMs) .setEndPositionMs(endPositionMs) .build() ) .build()
জাভা
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setClippingConfiguration( new ClippingConfiguration.Builder() .setStartPositionMs(startPositionMs) .setEndPositionMs(endPositionMs) .build()) .build();
অভ্যন্তরীণভাবে, DefaultMediaSourceFactory কন্টেন্ট মিডিয়া সোর্স মোড়ানোর জন্য একটি ClippingMediaSource ব্যবহার করবে। অতিরিক্ত ক্লিপিং বৈশিষ্ট্য রয়েছে। আরও বিস্তারিত জানার জন্য MediaItem.Builder Javadoc দেখুন।
বিজ্ঞাপন সন্নিবেশ
বিজ্ঞাপন সন্নিবেশ করার জন্য, একটি মিডিয়া আইটেমের বিজ্ঞাপন ট্যাগ URI সম্পত্তি সেট করা উচিত:
কোটলিন
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build()
জাভা
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build();
অভ্যন্তরীণভাবে, DefaultMediaSourceFactory বিজ্ঞাপন ট্যাগ দ্বারা সংজ্ঞায়িত বিজ্ঞাপন সন্নিবেশ করার জন্য কন্টেন্ট মিডিয়া সোর্সটিকে একটি AdsMediaSource এ মোড়ানো হবে। এটি কাজ করার জন্য, প্লেয়ারটিকে তার DefaultMediaSourceFactory সেই অনুযায়ী কনফিগার করা থাকতে হবে।