مدیریت حقوق دیجیتال

‫ExoPlayer از MediaDrm API در Android برای پشتیبانی از بازپخش محافظت‌شده با DRM استفاده می‌کند. حداقل نسخه‌های Android موردنیاز برای طرح‌های مختلف DRM پشتیبانی‌شده، به‌همراه قالب‌های جاری‌سازی که برای آن‌ها پشتیبانی می‌شوند، در جدول زیر شرح داده شده است:

طرح‌واره DRM شماره نسخه Android سطح میانای برنامه‌سازی کاربردی Android قالب‌های پشتیبانی‌شده
‫Widevine «cenc» ۴٫۴ 19 DASH،‏ HLS (فقط FMP4)
‫Widevine «cbcs» ‫۱-۷ 25 DASH،‏ HLS (فقط FMP4)
ClearKey «cenc» ۵ 21 DASH
PlayReady SL2000 "cenc" Android TV Android TV DASH،‏ SmoothStreaming،‏ HLS (فقط FMP4)

برای پخش محتوای محافظت‌شده با مدیریت حقوق دیجیتال با ExoPlayer، باید UUID سیستم مدیریت حقوق دیجیتال هنگام ساختن عنصر رسانه‌ای مشخص شود و ویژگی‌های دیگر نیز می‌توانند ارائه شوند. سپس پخش‌کننده از این دارایی‌ها برای ساختن پیاده‌سازی پیش‌فرض DrmSessionManager، به‌نام DefaultDrmSessionManager، استفاده می‌کند که برای اکثر موارد استفاده مناسب است. برای برخی موارد استفاده، ممکن است ویژگی‌های DRM اضافی لازم باشد، همان‌طور که در بخش‌های زیر توضیح داده شده است.

چرخش کلید

برای پخش جاری‌سازی‌ها با کلیدهای چرخشی، هنگام ساختن عنصر رسانه، true را به MediaItem.DrmConfiguration.Builder.setMultiSession منتقل کنید.

محتوای چندکلیدی

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

مورد ۱: سرور پروانه با همه کلیدهای محتوا پاسخ می‌دهد

در این مورد، سرور پروانه به‌گونه‌ای پیکربندی شده است که وقتی درخواست یک کلید را دریافت می‌کند، با همه کلیدهای محتوا پاسخ می‌دهد. این مورد بدون نیاز به پیکربندی خاصی توسط ExoPlayer مدیریت می‌شود. تطبیق بین جاری‌سازی‌ها (مثلاً ویدیو SD و HD) حتی اگر از کلیدهای مختلف استفاده کنند، یکپارچه است.

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

مورد ۲: سرور پروانه فقط با کلید درخواستی پاسخ می‌دهد

در این مورد، سرور پروانه پیکربندی شده است تا فقط با کلید مشخص‌شده در درخواست پاسخ دهد. محتوای چندکلیدی را می‌توان با این پیکربندی سرور پروانه با انتقال true به MediaItem.DrmConfiguration.Builder.setMultiSession هنگام ساختن عنصر رسانه پخش کرد.

توصیه نمی‌کنیم که سرور پروانه خود را به‌گونه‌ای پیکربندی کنید که چنین رفتاری داشته باشد. برای پخش محتوای چندکلیدی، به درخواست‌های پروانه اضافی نیاز دارد که نسبت به جایگزین توصیف‌شده در بالا، کارایی و استحکام کمتری دارد.

کلیدهای آفلاین

مجموعه کلید آفلاین را می‌توان با انتقال شناسه مجموعه کلید به MediaItem.DrmConfiguration.Builder.setKeySetId هنگام ساختن عنصر رسانه‌ای بار کرد. این کار امکان بازپخش بااستفاده از کلیدهای ذخیره‌شده در مجموعه کلید آفلاین با شناسه مشخص‌شده را فراهم می‌کند.

جلسات مدیریت حقوق دیجیتال برای محتوای شفاف

استفاده از جای‌بان DrmSessions به ExoPlayer اجازه می‌دهد از همان رمزگشاهایی برای محتوای واضح استفاده کند که هنگام پخش محتوای رمزگذاری‌شده استفاده می‌شود. وقتی رسانه حاوی بخش‌های واضح و رمزگذاری‌شده است، ممکن است بخواهید از جای‌بان DrmSessions استفاده کنید تا از ایجاد مجدد رمزگشاها هنگام انتقال بین بخش‌های واضح و رمزگذاری‌شده جلوگیری کنید. استفاده از جای‌بان DrmSessions برای قطعه‌های صوتی و ویدیویی را می‌توان با انتقال true به MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks هنگام ساختن عنصر رسانه‌ای فعال کرد.

استفاده از DrmSessionManager سفارشی

اگر برنامه‌ای بخواهد از DrmSessionManager سفارشی برای بازپخش استفاده کند، می‌تواند DrmSessionManagerProvider را پیاده‌سازی کند و آن را به MediaSource.Factory که هنگام ساختن پخش‌کننده استفاده می‌شود منتقل کند. ارائه‌دهنده می‌تواند انتخاب کند که آیا هر بار نمونه مدیر جدیدی ایجاد کند یا نه. برای همیشه استفاده از نمونه یکسان:

کاتلین

val customDrmSessionManager: DrmSessionManager = CustomDrmSessionManager()
// Pass a drm session manager provider to the media source factory.
val mediaSourceFactory =
  DefaultMediaSourceFactory(context).setDrmSessionManagerProvider { customDrmSessionManager }

جاوا

DrmSessionManager customDrmSessionManager = new CustomDrmSessionManager(/* ... */ );
// Pass a drm session manager provider to the media source factory.
MediaSource.Factory mediaSourceFactory =
    new DefaultMediaSourceFactory(context)
        .setDrmSessionManagerProvider(mediaItem -> customDrmSessionManager);

بهبود عملکرد بازپخش

اگر هنگام پخش محتوای محافظت‌شده با DRM در دستگاهی که از هر نسخه Android از Android 6.0 (سطح API 23) تا Android 11 (سطح API 30) استفاده می‌کند، با مشکل پرش ویدیو مواجه هستید، می‌توانید فعال کردن صف بافر ناهم‌زمان را امتحان کنید.