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

يستخدم 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 فقط)

لتشغيل محتوى محمي بنظام إدارة الحقوق الرقمية (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 من الإصدار 6.0 (المستوى 23 من واجهة برمجة التطبيقات) إلى الإصدار 11 (المستوى 30 من واجهة برمجة التطبيقات) ضِمنًا، يمكنك تجربة تفعيل ميزة "وضع البيانات في قائمة الانتظار بشكل غير متزامن".