ExoPlayer از MediaDrm
API اندروید برای پشتیبانی از پخش محافظت شده با DRM استفاده می کند. حداقل نسخههای اندروید مورد نیاز برای طرحهای مختلف DRM پشتیبانی شده، همراه با قالبهای جریانی که برای آنها پشتیبانی میشوند، در جدول زیر توضیح داده شدهاند:
طرح DRM | شماره نسخه اندروید | سطح API اندروید | فرمت های پشتیبانی شده |
---|---|---|---|
وایدواین "cenc" | 4.4 | 19 | DASH، HLS (فقط FMP4) |
Widevine "cbcs" | 7.1 | 25 | DASH، HLS (فقط FMP4) |
ClearKey "cenc" | 5.0 | 21 | داش |
PlayReady SL2000 "cenc" | Android TV | Android TV | DASH، SmoothStreaming، HLS (فقط FMP4) |
برای پخش محتوای محافظت شده با DRM با ExoPlayer، UUID سیستم DRM باید هنگام ساخت یک آیتم رسانه مشخص شود و ویژگی های دیگری نیز می تواند ارائه شود. سپس پخشکننده از این ویژگیها برای ساخت یک پیادهسازی پیشفرض از DrmSessionManager
به نام DefaultDrmSessionManager
استفاده میکند که برای بیشتر موارد استفاده مناسب است. برای برخی از موارد استفاده، ویژگی های DRM اضافی ممکن است لازم باشد، همانطور که در بخش های زیر توضیح داده شده است.
چرخش کلید
برای پخش جریانی با کلیدهای چرخان، هنگام ساخت آیتم رسانه، به MediaItem.DrmConfiguration.Builder.setMultiSession
true
ارسال کنید.
محتوای چند کلیدی
محتوای چند کلیدی از چندین جریان تشکیل شده است که در آن برخی از جریان ها از کلیدهای متفاوتی نسبت به بقیه استفاده می کنند. بسته به نحوه پیکربندی سرور مجوز، محتوای چند کلیدی را می توان به یکی از دو روش پخش کرد.
مورد 1: سرور مجوز با تمام کلیدهای محتوا پاسخ می دهد
در این حالت سرور لایسنس به گونه ای پیکربندی شده است که وقتی درخواست یک کلید را دریافت می کند، با تمام کلیدهای محتوا پاسخ می دهد. این کیس توسط ExoPlayer بدون نیاز به تنظیمات خاصی مدیریت می شود. انطباق بین جریان ها (به عنوان مثال ویدیوی SD و HD) بدون درز است حتی اگر از کلیدهای مختلف استفاده کنند.
در صورت امکان، توصیه می کنیم سرور مجوز خود را پیکربندی کنید تا به این شکل رفتار کند. این کارآمدترین و قویترین راه برای پشتیبانی از پخش محتوای چند کلیدی است، زیرا برای دسترسی به جریانهای مختلف به مشتری نیازی به درخواست مجوزهای متعدد ندارد.
مورد 2: سرور مجوز فقط با کلید درخواستی پاسخ می دهد
در این حالت، سرور لایسنس طوری پیکربندی شده است که تنها با کلید مشخص شده در درخواست پاسخ دهد. محتوای چند کلیدی را میتوان با این پیکربندی سرور مجوز با ارسال true
به MediaItem.DrmConfiguration.Builder.setMultiSession
هنگام ساخت آیتم رسانه پخش کرد.
ما توصیه نمی کنیم سرور مجوز خود را پیکربندی کنید تا به این شکل رفتار کند. برای پخش محتوای چند کلیدی به درخواست های مجوز اضافی نیاز دارد که نسبت به جایگزینی که در بالا توضیح داده شد کارآمدتر و قوی تر است.
کلیدهای آفلاین
یک مجموعه کلید آفلاین را می توان با ارسال شناسه مجموعه کلید به MediaItem.DrmConfiguration.Builder.setKeySetId
هنگام ساخت آیتم رسانه بارگیری کرد. این امکان پخش با استفاده از کلیدهای ذخیره شده در مجموعه کلید آفلاین با شناسه مشخص شده را فراهم می کند.
جلسات DRM برای محتوای واضح
استفاده از متغیر 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) تا اندروید 11 (سطح API 30) استفاده میکند، با لکنت ویدیو مواجه میشوید، میتوانید صف بافر ناهمزمان را فعال کنید .