فایل‌های رسانه‌ای

میانای برنامه‌سازی کاربردی فهرست پخش براساس نمونه‌های 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();

پیوست کردن فراداده می‌تواند برای به‌روزرسانی واسط کاربر برنامه‌تان هنگام انتقال فهرست پخش مفید باشد.

تصاویر

بازپخش تصاویر به مدت‌زمان فایل رسانه‌ای نیاز دارد تا مشخص شود تصویر چه مدت باید درطول بازپخش نشان داده شود. برای اطلاعات بیشتر درباره عکس‌های حرکتی و کتابخانه‌های بار کردن تصویر (برای مثال، 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 دارای افزونه غیراستاندارد باشد یا اصلاً افزونه نداشته باشد، نوع 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())
    .build()

جاوا

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build())
        .build();

در داخل، DefaultMediaSourceFactory منبع رسانه محتوا را در یک AdsMediaSource می‌پیچد تا آگهی‌ها را طبق تعریف برچسب آگهی درج کند. برای اینکه این کار انجام شود، DefaultMediaSourceFactory پخش‌کننده نیز باید به‌طور مناسب پیکربندی شده باشد.