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 = 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 برای بسته بندی منبع رسانه محتوا استفاده می کند. ویژگی های برش اضافی وجود دارد. برای جزئیات بیشتر به 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 خود را بر این اساس پیکربندی کند.