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();
پیوست کردن ابرداده میتواند برای بهروزرسانی رابط کاربری برنامهتان در هنگام انتقال فهرست پخش مفید باشد.
تصاویر
بازپخش تصاویر به مدت زمانی در آیتم رسانه ای نیاز دارد تا مشخص شود چه مدت تصویر باید در حین پخش نمایش داده شود. برای اطلاعات بیشتر در مورد عکسهای متحرک و کتابخانههای بارگیری تصویر (به عنوان مثال، سر خوردن) به صفحه راهنمای تصاویر مراجعه کنید.
کاتلین
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 = 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
برای بسته بندی منبع رسانه محتوا استفاده می کند. ویژگی های برش اضافی وجود دارد. برای جزئیات بیشتر به MediaItem.Builder
Javadoc مراجعه کنید.
درج آگهی
برای درج تبلیغات، ویژگی URI تگ آگهی یک مورد رسانه باید تنظیم شود:
کاتلین
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build())
جاوا
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build();
در داخل، DefaultMediaSourceFactory
منبع رسانه محتوا را در AdsMediaSource
میپیچد تا تبلیغات را همانطور که توسط تگ آگهی تعریف شده است درج کند. برای این کار، پخش کننده همچنین باید DefaultMediaSourceFactory
خود را بر این اساس پیکربندی کند.