إدارة الحقوق الرقمية

يستخدم ExoPlayer واجهة برمجة التطبيقات MediaDrm في Android لتوفير إمكانية التشغيل المحمي بنظام إدارة الحقوق الرقمية. يوضّح الجدول التالي الحد الأدنى لإصدارات Android المطلوبة لمختلف أنظمة إدارة الحقوق الرقمية المتوافقة، بالإضافة إلى تنسيقات البث المتوافقة معها:

مخطط إدارة الحقوق الرقمية رقم إصدار Android مستوى واجهة برمجة التطبيقات Android التنسيقات المعتمدة
Widevine "cenc" 4.4 19 DASH وHLS (FMP4 فقط)
Widevine "cbcs" ‫7.1 25 البث الديناميكي التكيُّفي عبر HTTP ‏(DASH)، والبث المباشر وفق بروتوكول HTTP ‏(HLS) (تنسيق FMP4 فقط)
ClearKey "cenc" 5.0 21 DASH
‫PlayReady SL2000 "cenc" Android TV Android TV DASH وSmoothStreaming وHLS (FMP4 فقط)

لتشغيل محتوى محمي بنظام إدارة الحقوق الرقمية (DRM) باستخدام ExoPlayer، يجب تحديد المعرّف الفريد العالمي (UUID) لنظام إدارة الحقوق الرقمية عند إنشاء عنصر وسائط، ويمكن أيضًا توفير خصائص أخرى. سيستخدم المشغّل بعد ذلك هذه الخصائص لإنشاء تنفيذ تلقائي للواجهة DrmSessionManager، يُطلق عليه اسم DefaultDrmSessionManager، وهو مناسب لمعظم حالات الاستخدام. في بعض حالات الاستخدام، قد يكون من الضروري توفير خصائص إضافية لإدارة الحقوق الرقمية، كما هو موضّح في الأقسام التالية.

تدوير المفتاح

لتشغيل بث باستخدام مفاتيح متناوبة، مرِّر true إلى MediaItem.DrmConfiguration.Builder.setMultiSession عند إنشاء عنصر الوسائط.

المحتوى الذي يتضمّن مفاتيح متعددة

يتألف المحتوى المتعدد المفاتيح من عدة مصادر، حيث تستخدم بعض المصادر مفاتيح مختلفة عن غيرها. يمكن تشغيل المحتوى الذي يتضمّن مفاتيح متعددة بإحدى الطريقتَين التاليتَين، وذلك حسب طريقة إعداد خادم الترخيص.

الحالة 1: يستجيب خادم الترخيص بجميع مفاتيح المحتوى

في هذه الحالة، يتم ضبط خادم الترخيص على أنّه عندما يتلقّى طلبًا لمفتاح واحد، يستجيب بجميع مفاتيح المحتوى. يتعامل 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 من واجهة برمجة التطبيقات) ضِمنًا، يمكنك تجربة تفعيل وضع قائمة الانتظار غير المتزامن للمخزن المؤقت.