API لیست پخش مبتنی بر نمونههای MediaItem است که میتوان آنها را به راحتی با استفاده از MediaItem.Builder ساخت. درون پخشکننده، یک MediaItem توسط MediaSource.Factory به یک MediaSource قابل پخش تبدیل میشود. بدون پیکربندی سفارشی ، این تبدیل توسط DefaultMediaSourceFactory انجام میشود که قادر به ساخت منابع رسانهای پیچیده مطابق با ویژگیهای آیتم رسانهای است. برخی از ویژگیهایی که میتوان روی آیتمهای رسانهای تنظیم کرد در زیر شرح داده شده است.
اقلام رسانهای ساده
یک آیتم رسانهای که فقط از URI جریانی تشکیل شده باشد، میتواند با متد fromUri ساخته شود:
کاتلین
val mediaItem = MediaItem.fromUri(videoUri)
جاوا
MediaItem mediaItem = MediaItem.fromUri(videoUri);
برای سایر موارد، میتوان از MediaItem.Builder استفاده کرد. در مثال زیر، یک آیتم رسانهای با یک شناسه (ID) و برخی فرادادههای پیوست شده ساخته شده است:
کاتلین
val mediaItem = MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build()
جاوا
MediaItem mediaItem = new MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build();
پیوست کردن متادیتا میتواند برای بهروزرسانی رابط کاربری برنامه شما هنگام انتقال لیست پخش مفید باشد.
تصاویر
پخش تصاویر نیاز به مدت زمان در آیتم رسانه دارد تا مشخص شود تصویر در طول پخش چه مدت باید نمایش داده شود. برای اطلاعات بیشتر در مورد عکسهای متحرک و کتابخانههای بارگذاری تصویر (به عنوان مثال، Glide) به صفحه راهنمای تصاویر مراجعه کنید.
کاتلین
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 از یک MergingMediaSource برای ترکیب منبع رسانه محتوا با یک SingleSampleMediaSource برای هر آهنگ زیرنویس استفاده میکند. 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 برای قرار دادن منبع رسانه محتوا استفاده میکند. ویژگیهای برش اضافی نیز وجود دارد. برای جزئیات بیشتر به Javadoc MediaItem.Builder مراجعه کنید.
درج آگهی
برای درج تبلیغات، باید ویژگی 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 قرار میدهد تا تبلیغات را طبق تعریف تگ ad درج کند. برای اینکه این کار انجام شود، پخشکننده نیز باید DefaultMediaSourceFactory خود را بر این اساس پیکربندی کند.