يستخدم ExoPlayer واجهة برمجة التطبيقات MediaDrm
من Android لإتاحة التشغيل المحمي بإدارة الحقوق الرقمية.
في الجدول التالي، يمكنك الاطّلاع على الحد الأدنى لإصدارات Android المطلوبة لمختلف مخططات إدارة الحقوق الرقمية المتوافقة، بالإضافة إلى تنسيقات البث المتوافقة معها:
مخطّط إدارة الحقوق الرقمية | رقم إصدار Android | مستوى واجهة برمجة تطبيقات Android | التنسيقات المعتمدة |
---|---|---|---|
Widevine "cenc" | 4.4 | 19 | DASH، HLS (FMP4 فقط) |
Widevine "cbcs" | 7.1 | 25 | DASH، HLS (FMP4 فقط) |
ClearKey "cenc" | 5.0 | 21 | DASH |
PlayReady SL2000 "cenc" | Android TV | Android TV | DASH وSmoothStreaming وHLS (FMP4 فقط) |
لتشغيل محتوى محمي بإدارة الحقوق الرقمية باستخدام ExoPlayer، يجب تحديد معرّف UUID لنظام إدارة الحقوق الرقمية
عند إنشاء عنصر وسائط، ويمكن أيضًا تقديم خصائص
أخرى. سيستخدم المشغّل بعد ذلك هذه السمات ل
إنشاء تنفيذ تلقائي لـ DrmSessionManager
، يُسمى
DefaultDrmSessionManager
، وهو مناسب لمعظم حالات الاستخدام. في بعض حالات الاستخدام، قد تكون سمات إدارة الحقوق الرقمية الإضافية ضرورية، كما هو موضّح في الأقسام التالية.
تدوير المفاتيح
لتشغيل أحداث البث باستخدام مفاتيح دوارة، مرِّر true
إلى
MediaItem.DrmConfiguration.Builder.setMultiSession
أثناء إنشاء عنصر الوسائط.
المحتوى المتعدّد المفاتيح
يتألف المحتوى المتعدّد المفاتيح من مصادر بيانات متعددة، حيث تستخدم بعض مصادر البيانات مفاتيح مختلفة عن غيرها. يمكن تشغيل المحتوى المزوّد بمفاتيح متعددة بطريقتَين، استنادًا إلى طريقة ضبط خادم التراخيص.
الحالة الأولى: يستجيب خادم الترخيص مع توفير جميع المفاتيح للمحتوى
في هذه الحالة، يتم ضبط خادم الترخيص بحيث يستجيب بجميع مفاتيح المحتوى عندما يتلقّى طلبًا للحصول على مفتاح واحد. يعالج ExoPlayer هذه الحالة بدون الحاجة إلى أي إعدادات خاصة. تكون التكيّف بين مجموعات البث (مثل الفيديو بدقة عادية ودقة عالية) سلسة حتى في حال استخدام مفاتيح مختلفة.
ننصحك بضبط خادم الترخيص على التصرّف بهذه الطريقة كلما أمكن ذلك. وهي الطريقة الأكثر فعالية وقوة لتفعيل تشغيل المحتوى المتعدّد المفاتيح، لأنّها لا تتطلّب من العميل تقديم طلبات ترخيص متعددة للوصول إلى أحداث البث المختلفة.
الحالة 2: يستجيب خادم الترخيص بالمفتاح المطلوب فقط
في هذه الحالة، يتم ضبط خادم الترخيص للردّ باستخدام المفتاح
المحدّد فقط في الطلب. يمكن تشغيل المحتوى المزوّد بمفاتيح متعددة باستخدام إعدادات ملف الترخيص
هذا على الخادم من خلال ضبط true
على
MediaItem.DrmConfiguration.Builder.setMultiSession
عند إنشاء ملف الوسائط.
لا ننصحك بتهيئة خادم الترخيص للعمل بهذه الطريقة. ويتطلب ذلك إرسال طلبات ترخيص إضافية لتشغيل المحتوى المزوّد بمفاتيح متعددة، وهو أقل فعالية وقوة من البديل الموضّح أعلاه.
مفاتيح بلا إنترنت
يمكن تحميل مجموعة مفاتيح بلا إنترنت من خلال تمرير معرّف مجموعة المفاتيح إلى
MediaItem.DrmConfiguration.Builder.setKeySetId
عند إنشاء عنصر الوسائط.
يتيح ذلك التشغيل باستخدام المفاتيح المخزّنة في مجموعة مفاتيح التشغيل بلا إنترنت باستخدام
المعرّف المحدّد.
جلسات إدارة الحقوق الرقمية للمحتوى الواضح
يتيح استخدام العنصر النائب DrmSessions
لـ ExoPlayer
استخدام برامج فك التشفير نفسها لمعالجة المحتوى الواضح كما هو الحال عند تشغيل المحتوى المشفَّر. عندما تحتوي الوسائط على
أقسام واضحة ومشفّرة، قد تحتاج إلى استخدام العنصر النائب DrmSessions
لتجنّب إعادة إنشاء برامج الترميز عند حدوث عمليات انتقال بين الأقسام الواضحة ومشفّرة. يمكن تفعيل استخدام العنصر النائب DrmSessions
لمقاطع الصوت والفيديو
عن طريق ضبط true
على
MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks
عند
إنشاء عنصر الوسائط.
استخدام DrmSessionManager مخصص
إذا أراد أحد التطبيقات تخصيص DrmSessionManager
المستخدَمة لتشغيل المحتوى، يمكنه
تنفيذ DrmSessionManagerProvider
ونقلها إلى
MediaSource.Factory
التي تُستخدَم عند إنشاء المشغّل. يمكن لمقدّم الخدمة
اختيار ما إذا كان يريد إنشاء مثيل جديد لواجهة برمجة التطبيقات كل مرة أم لا. لاستخدام المثيل نفسه دائمًا:
Kotlin
val customDrmSessionManager: DrmSessionManager = CustomDrmSessionManager() // Pass a drm session manager provider to the media source factory. val mediaSourceFactory = DefaultMediaSourceFactory(context).setDrmSessionManagerProvider { customDrmSessionManager }
Java
DrmSessionManager customDrmSessionManager = new CustomDrmSessionManager(/* ... */ ); // Pass a drm session manager provider to the media source factory. MediaSource.Factory mediaSourceFactory = new DefaultMediaSourceFactory(context) .setDrmSessionManagerProvider(mediaItem -> customDrmSessionManager);
تحسين أداء التشغيل
إذا كنت تواجه تقطُّعًا في الفيديو عند تشغيل محتوى محمي بإدارة الحقوق الرقمية على جهاز يعمل بأي إصدار من Android بدءًا من Android 6.0 (المستوى 23 من واجهة برمجة التطبيقات) وحتى Android 11 (المستوى 30 من واجهة برمجة التطبيقات) بما في ذلك، يمكنك محاولة تفعيل وضع "تخزين مؤقت غير متزامن في قائمة الانتظار".