ExoPlayer از رابط برنامهنویسی کاربردی MediaDrm اندروید برای پشتیبانی از پخش محافظتشده با DRM استفاده میکند. حداقل نسخههای اندروید مورد نیاز برای طرحهای مختلف DRM پشتیبانیشده، به همراه فرمتهای پخشی که از آنها پشتیبانی میشود، در جدول زیر شرح داده شده است:
| طرح DRM | شماره نسخه اندروید | سطح API اندروید | فرمتهای پشتیبانیشده |
|---|---|---|---|
| وایدوین "سنک" | ۴.۴ | ۱۹ | DASH، HLS (فقط FMP4) |
| وایدوین "سیبیاس" | ۷.۱ | ۲۵ | DASH، HLS (فقط FMP4) |
| کلید پاک کننده "cenc" | ۵.۰ | ۲۱ | دش |
| PlayReady SL2000 "cenc" | تلویزیون اندروید | تلویزیون اندروید | DASH، SmoothStreaming، HLS (فقط FMP4) |
برای پخش محتوای محافظتشده با DRM با ExoPlayer، هنگام ساخت یک آیتم رسانهای ، باید UUID سیستم DRM مشخص شود و ویژگیهای دیگری نیز میتوانند ارائه شوند. سپس پخشکننده از این ویژگیها برای ساخت یک پیادهسازی پیشفرض از DrmSessionManager به نام DefaultDrmSessionManager استفاده میکند که برای اکثر موارد استفاده مناسب است. برای برخی موارد استفاده، ممکن است ویژگیهای DRM اضافی لازم باشد، همانطور که در بخشهای بعدی توضیح داده شده است.
چرخش کلید
برای پخش جریانها با کلیدهای چرخان، هنگام ساخت آیتم رسانه، مقدار true به MediaItem.DrmConfiguration.Builder.setMultiSession ارسال کنید.
محتوای چندکلید
محتوای چندکلید شامل چندین جریان است که در آن برخی از جریانها از کلیدهای متفاوتی نسبت به سایرین استفاده میکنند. محتوای چندکلید را میتوان به یکی از دو روش پخش کرد، بسته به نحوه پیکربندی سرور مجوز.
مورد ۱: سرور مجوز با تمام کلیدهای مربوط به محتوا پاسخ میدهد
در این حالت، سرور لایسنس به گونهای پیکربندی شده است که وقتی درخواستی برای یک کلید دریافت میکند، با تمام کلیدهای مربوط به محتوا پاسخ دهد. این مورد توسط ExoPlayer بدون نیاز به هیچ پیکربندی خاصی انجام میشود. تطبیق بین جریانها (مثلاً ویدیوی SD و HD) حتی اگر از کلیدهای متفاوتی استفاده کنند، بدون مشکل انجام میشود.
در صورت امکان، توصیه میکنیم سرور لایسنس خود را طوری پیکربندی کنید که به این روش رفتار کند. این کارآمدترین و قویترین روش برای پشتیبانی از پخش محتوای چندکلید است، زیرا نیازی نیست که کلاینت برای دسترسی به جریانهای مختلف، درخواستهای مجوز متعددی ارسال کند.
مورد ۲: سرور مجوز فقط با کلید درخواستی پاسخ میدهد
در این حالت، سرور لایسنس طوری پیکربندی شده است که فقط با کلید مشخص شده در درخواست پاسخ دهد. محتوای چندکلیدی را میتوان با این پیکربندی سرور لایسنس با ارسال true به MediaItem.DrmConfiguration.Builder.setMultiSession هنگام ساخت آیتم رسانه، پخش کرد.
ما پیکربندی سرور لایسنس خود را برای این رفتار توصیه نمیکنیم. این روش برای پخش محتوای چندکلید به درخواستهای لایسنس اضافی نیاز دارد که نسبت به روش جایگزین توضیح داده شده در بالا، کارایی و استحکام کمتری دارد.
کلیدهای آفلاین
یک مجموعه کلید آفلاین را میتوان با ارسال شناسه مجموعه کلید به MediaItem.DrmConfiguration.Builder.setKeySetId هنگام ساخت آیتم رسانهای بارگذاری کرد. این کار امکان پخش با استفاده از کلیدهای ذخیره شده در مجموعه کلید آفلاین با شناسه مشخص شده را فراهم میکند.
جلسات DRM برای محتوای واضح
استفاده از DrmSessions به ExoPlayer اجازه میدهد تا از همان رمزگشاهایی برای محتوای واضح استفاده کند که هنگام پخش محتوای رمزگذاری شده استفاده میشود. هنگامی که رسانه شامل بخشهای واضح و رمزگذاری شده است، ممکن است بخواهید از DrmSessions برای جلوگیری از ایجاد مجدد رمزگشاها هنگام انتقال بین بخشهای واضح و رمزگذاری شده استفاده کنید. استفاده از DrmSessions برای آهنگهای صوتی و تصویری را میتوان با ارسال true به MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks هنگام ساخت آیتم رسانه فعال کرد.
استفاده از DrmSessionManager سفارشی
اگر برنامهای بخواهد DrmSessionManager مورد استفاده برای پخش را سفارشی کند، میتواند یک DrmSessionManagerProvider پیادهسازی کند و آن را به MediaSource.Factory که هنگام ساخت پخشکننده استفاده میشود، ارسال کند. ارائهدهنده میتواند انتخاب کند که آیا هر بار یک نمونه جدید از manager ایجاد کند یا خیر. برای اینکه همیشه از همان نمونه استفاده شود:
کاتلین
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 در دستگاهی که هر نسخهای از اندروید از اندروید ۶.۰ (سطح API ۲۳) تا اندروید ۱۱ (سطح API ۳۰) را اجرا میکند، با مشکل قطع و وصل شدن ویدیو مواجه میشوید، میتوانید صفبندی بافر ناهمزمان را فعال کنید .