بدءًا من الإصدار 8.0 من نظام التشغيل Android (المستوى 26 من واجهة برمجة التطبيقات)، تتضمّن MediaPlayer واجهات برمجة تطبيقات تتيح تشغيل المواد المحمية بموجب إدارة الحقوق الرقمية (DRM). تتشابه واجهات برمجة التطبيقات لإدارة الحقوق الرقمية في MediaPlayer مع واجهة برمجة التطبيقات المنخفضة المستوى التي توفّرها MediaDrm، ولكنها تعمل على مستوى أعلى ولا تعرض عناصر الاستخراج وإدارة الحقوق الرقمية والتشفير الأساسية.
على الرغم من أنّ واجهة برمجة التطبيقات MediaPlayer DRM API لا توفّر الوظائف الكاملة الخاصة بـ
MediaDrm، إلا أنّها تتوافق مع حالات الاستخدام الأكثر شيوعًا. يمكن أن يتعامل التنفيذ الحالي مع أنواع المحتوى التالية:
- ملفات الوسائط المحلية المحمية بواسطة Widevine
- ملفات الوسائط البعيدة أو ملفات الوسائط المتدفقة المحمية بواسطة Widevine
يوضّح مقتطف الرمز التالي كيفية استخدام طرق MediaPlayer الجديدة لإدارة الحقوق الرقمية في عملية تنفيذ متزامنة.
لإدارة الوسائط المحمية بنظام إدارة الحقوق الرقمية، عليك تضمين الطرق الجديدة إلى جانب المسار المعتاد لطلبات MediaPlayer، كما هو موضّح في هذا المثال:
Kotlin
mediaPlayer?.apply {
setDataSource()
setOnDrmConfigHelper() // optional, for custom configuration
prepare()
drmInfo?.also {
prepareDrm()
getKeyRequest()
provideKeyResponse()
}
// MediaPlayer is now ready to use
start()
// ...play/pause/resume...
stop()
releaseDrm()
}
Java
setDataSource();
setOnDrmConfigHelper(); // optional, for custom configuration
prepare();
if (getDrmInfo() != null) {
prepareDrm();
getKeyRequest();
provideKeyResponse();
}
// MediaPlayer is now ready to use
start();
// ...play/pause/resume...
stop();
releaseDrm();
ابدأ بتهيئة عنصر MediaPlayer وتحديد مصدره باستخدام setDataSource() كالمعتاد. بعد ذلك، اتّبِع الخطوات التالية لاستخدام نظام "إدارة الحقوق الرقمية":
- إذا كنت تريد أن ينفّذ تطبيقك عملية إعداد مخصّصة، عليك تحديد واجهة
OnDrmConfigHelperوربطها بالمشغّل باستخدامsetOnDrmConfigHelper(). - اتّصِل بالرقم
prepare(). - اتّصِل بالرقم
getDrmInfo(). إذا كان المصدر يتضمّن محتوًى محميًا بنظام إدارة الحقوق الرقمية، تعرض الطريقة قيمةMediaPlayer.DrmInfoغير فارغة.
إذا كان MediaPlayer.DrmInfo موجودًا:
- افحص خريطة أرقام التعريف الفريدة العالمية المتاحة واختَر أحدها.
- جهِّز إعدادات إدارة الحقوق الرقمية للمصدر الحالي من خلال استدعاء
prepareDrm().- إذا أنشأت دالة ردّ اتصال
OnDrmConfigHelperوسجّلتها، سيتم استدعاؤها أثناء تنفيذprepareDrm(). يتيح لك ذلك إجراء إعدادات مخصّصة لخصائص إدارة الحقوق الرقمية (DRM) قبل فتح جلسة إدارة الحقوق الرقمية. يتم استدعاء دالة الرجوع بشكل متزامن في سلسلة المحادثات التي استدعتprepareDrm(). للوصول إلى خصائص إدارة الحقوق الرقمية، استدعِ الدالتَينgetDrmPropertyString()وsetDrmPropertyString(). تجنَّب تنفيذ عمليات طويلة. - إذا لم يتم إعداد الجهاز بعد، سيصل
prepareDrm()أيضًا إلى خادم الإعداد لإعداد الجهاز. يمكن أن تستغرق هذه العملية وقتًا متفاوتًا حسب جودة الاتصال بالشبكة.
- إذا أنشأت دالة ردّ اتصال
- للحصول على مصفوفة بايت لطلب مفتاح غير شفاف لإرسالها إلى خادم ترخيص، استخدِم الدالة
getKeyRequest(). - لإبلاغ نظام إدارة الحقوق الرقمية (DRM) بشأن رد المفتاح الذي تم تلقّيه من خادم الترخيص، استدعِ الدالة
provideKeyResponse(). تعتمد النتيجة على نوع طلب المفتاح:- إذا كان الردّ على طلب مفتاح بلا إنترنت، تكون النتيجة معرّفًا لمجموعة مفاتيح. يمكنك استخدام معرّف مجموعة المفاتيح هذا مع
restoreKeys()لاستعادة المفاتيح إلى جلسة جديدة. - إذا كانت الاستجابة لطلب بث أو إصدار، تكون النتيجة فارغة.
- إذا كان الردّ على طلب مفتاح بلا إنترنت، تكون النتيجة معرّفًا لمجموعة مفاتيح. يمكنك استخدام معرّف مجموعة المفاتيح هذا مع
إعداد نظام إدارة الحقوق الرقمية بشكل غير متزامن
يتم تشغيل prepareDrm() بشكل متزامن تلقائيًا، ما يؤدي إلى الحظر إلى أن تنتهي عملية الإعداد. ومع ذلك، قد تتطلّب عملية إعداد إدارة الحقوق الرقمية للمرة الأولى على جهاز جديد توفيرًا أيضًا، وهو ما تتولاه prepareDrm() داخليًا، وقد يستغرق بعض الوقت بسبب عملية الشبكة المعنية. يمكنك تجنُّب الحظر على prepareDrm() من خلال تحديد MediaPlayer.OnDrmPreparedListener وضبطه.
اضبط OnDrmPreparedListener. يُجري prepareDrm() عملية الإعداد (إذا لزم الأمر) والتحضير في الخلفية. عند انتهاء عملية توفير الموارد والإعداد، يستدعي النظام المستمع. لا تفترض أي شيء بشأن ترتيب الاستدعاء أو سلسلة التعليمات التي يتم تشغيل المتتبِّع فيها (إلا إذا سجّلت المتتبِّع باستخدام سلسلة تعليمات معالجة). يمكن للنظام استدعاء
المستمع قبل أو بعد أن تعرض الدالة prepareDrm() النتيجة.
إعداد "إدارة الحقوق الرقمية" بشكل غير متزامن
يمكنك بدء DRM بشكل غير متزامن من خلال إنشاء وتسجيل
MediaPlayer.OnDrmInfoListener لإعداد DRM و
MediaPlayer.OnDrmPreparedListener لبدء المشغّل. تعمل هذه السمة بالتزامن مع prepareAsync()، كما هو موضّح في هذا المثال:
Kotlin
setOnPreparedListener()
setOnDrmInfoListener()
setDataSource()
prepareAsync()
// ...
// If the data source content is protected you receive a call to the onDrmInfo() callback.
override fun onDrmInfo(mediaPlayer: MediaPlayer, drmInfo: MediaPlayer.DrmInfo) {
mediaPlayer.apply {
prepareDrm()
getKeyRequest()
provideKeyResponse()
}
}
// When prepareAsync() finishes, you receive a call to the onPrepared() callback.
// If there is a DRM, onDrmInfo() sets it up before executing this callback,
// so you can start the player.
override fun onPrepared(mediaPlayer: MediaPlayer) {
mediaPlayer.start()
}
Java
setOnPreparedListener();
setOnDrmInfoListener();
setDataSource();
prepareAsync();
// ...
// If the data source content is protected you receive a call to the onDrmInfo() callback.
onDrmInfo() {
prepareDrm();
getKeyRequest();
provideKeyResponse();
}
// When prepareAsync() finishes, you receive a call to the onPrepared() callback.
// If there is a DRM, onDrmInfo() sets it up before executing this callback,
// so you can start the player.
onPrepared() {
start();
}
التعامل مع الوسائط المشفّرة
بدءًا من الإصدار 8.0 من نظام التشغيل Android (المستوى 26 من واجهة برمجة التطبيقات)، يمكن MediaPlayer أيضًا فك تشفير الوسائط المشفرة على مستوى العيّنة باستخدام نظام التشفير الشائع (CENC) والبث المباشر وفق بروتوكول HTTP (HLS) (METHOD=SAMPLE-AES) لأنواع البث الأساسية H.264 والترميز المتقدّم للصوت (AAC). كانت ملفات الوسائط المشفّرة بالكامل (METHOD=AES-128) متاحة في السابق.
مزيد من المعلومات
Jetpack Media3 هو الحلّ المقترَح لتشغيل الوسائط في تطبيقك. مزيد من المعلومات
تتناول هذه الصفحات مواضيع متعلقة بتسجيل الصوت والفيديو وتخزينهما وتشغيلهما: