يمكنك توسيع مكوّنات مستخرج الوسائط وبرنامج ترميز الوسائط باستخدام إضافات المورّد. لا يمكن تخصيص واجهتَي برمجة التطبيقات MediaSession2 وMediaParser (ولكن يمكنك إرسال التغييرات إلى واجهتَي برمجة التطبيقات القديمتَين MediaPlayer وMediaSession).
لإتاحة أنواع وسائط إضافية في إطار عمل الوسائط في Android، عليك أن تنشئ مستخرجًا مخصّصًا وبرنامج فك ترميز. على سبيل المثال، لإتاحة فيديو Windows Media في ملفات AVI، عليك إنشاء مستخرج AVI وبرنامج فك ترميز فيديو Windows Media Windows Media.
معلومات عن الإضافات
إذا لم تستوفِ مستخرجات الوسائط التلقائية متطلباتك، يمكنك وضع مكوّنات إضافية مخصّصة للمستخرج في /system/lib[64]/extractors/. تحمِّل عملية المستخرج تلقائيًا مكوّنات المستخرج الإضافية من حزمة APEX التي توفّرها Google ومن /system/lib[64]/extractors/.
وبالمثل، يمكنك إعداد خدمات مخصّصة لبرنامج ترميز الوسائط تستخدم واجهة Codec 2.0 المحدّدة في frameworks/av/media/codec2/core/. للحصول على عملية تنفيذ أساسية، يُرجى الرجوع إلى frameworks/av/media/codec2/hidl/services/. نقطة دخول المكتبة هي واجهة C2ComponentStore. للحصول على مثال، يُرجى الرجوع إلى عملية تنفيذ متجر برامج ترميز البرامج التلقائية في frameworks/av/media/codec2/vndk/C2Store.cpp.
عند استخدام حزمة APEX الخاصة بك، يمكنك تنظيم خدمة برنامج الترميز وتحميل ملف APEX باستخدام العمليات نفسها التي تستخدمها خدمة mediaswcodec. لإجراء ذلك، عليك تحديد مكتبة مشترَكة على المستوى الأعلى مسؤولة عن تسجيل جميع مكوّنات C2، ثم إنشاء حزمة APEX (مع التبعيات المتعدية) موجودة في قسم المورّد. عند بدء عملية خدمة برنامج ترميز المورّد، يمكنها بعد ذلك تحميل نقطة الدخول هذه على المستوى الأعلى.
إنشاء مستخرج
عند إضافة مستخرج لتنسيق جديد، تأكَّد من أنّ المستخرج يعتمد فقط على واجهات برمجة تطبيقات NDK الثابتة ولا يعتمد على أي واجهات برمجة تطبيقات خاصة. يجب أن تنفّذ المستخرجات واجهة برمجة التطبيقات المحدّدة في frameworks/av/include/media/MediaExtractorPluginApi.h ويمكنها استخدام أغلفة C++ الملائمة في frameworks/av/include/media/MediaExtractorPluginHelper.h. بما أنّ Android 10 أو الإصدارات الأحدث لا تتيح سوى أعلى إصدار من واجهة برمجة تطبيقات المستخرج، احرص على تصميم المستخرج وفقًا للمستخرج الذي يحمل أعلى رقم إصدار لواجهة برمجة التطبيقات.
ضَع المستخرجات المخصّصة في /system/lib/64/extractors أو في حزمة APEX الخاصة بالمورّد، والتي يتم فتحها مع حزمة APEX من Google التي تحتوي على مستخرجات Google. للتحقّق من أنّ إطار العمل قد حمّل المستخرج، نفِّذ الأمر التالي.
adb shell dumpsys media.extractorيجب أن تظهر لك قائمة بالمستخرجات المتاحة مشابهة لما يلي.
Available extractors:
AAC Extractor: plugin\_version(2), uuid(4fd80eae03d24d729eb948fa6bb54613), version(1), path(/system/lib64/extractors/libaacextractor.so)
AMR Extractor: plugin\_version(2), uuid(c86639c92f3140aca715fa01b4493aaf), version(1), path(/system/lib64/extractors/libamrextractor.so)
FLAC Extractor: plugin\_version(2), uuid(1364b048cc454fda9934327d0ebf9829), version(1), path(/system/lib64/extractors/libflacextractor.so)
MIDI Extractor: plugin\_version(2), uuid(ef6cca0af8a243e6ba5fdfcd7c9a7ef2), version(1), path(/system/lib64/extractors/libmidiextractor.so)
MP3 Extractor: plugin\_version(2), uuid(812a3f6cc8cf46deb5293774b14103d4), version(1), path(/system/lib64/extractors/libmp3extractor.so)
MP4 Extractor: plugin\_version(2), uuid(27575c6744174c548d3d8e626985a164), version(2), path(/system/lib64/extractors/libmp4extractor.so)
MPEG2-PS/TS Extractor: plugin\_version(1), uuid(3d1dcfebe40a436da574c2438a555e5f), version(1), path(/system/lib64/extractors/libmpeg2extractor.so)
Matroska Extractor: plugin\_version(2), uuid(abbedd9238c44904a4c1b3f45f899980), version(1), path(/system/lib64/extractors/libmkvextractor.so)
Ogg Extractor: plugin\_version(2), uuid(8cc5cd06f772495e8a62cba9649374e9), version(1), path(/system/lib64/extractors/liboggextractor.so)
WAV Extractor: plugin\_version(3), uuid(7d61385858374a3884c5332d1cddee27), version(1), path(/system/lib64/extractors/libwavextractor.so)
إذا كان المستخرج المخصّص يتيح تنسيقًا يتيحه مستخرج توفّره Google، يمكنك إجبار إطار العمل على استخدام المستخرج من خلال استخدام الدالة Sniff() لعرض مستوى ثقة أعلى من المستوى الذي يوفّره المستخرج من Google.
عندما يحمِّل إطار عمل الوسائط المستخرج (من /system/lib/64/extractors أو من حزمة APEX الخاصة بالمورّد)، يتعرّف على الملف ويحصل على معلومات عن محتواه. الخطوة التالية هي إضافة برنامج فك ترميز للتنسيق حتى يتمكّن إطار العمل من فهم كيفية تحليل محتوى الملف.
إنشاء برنامج فك ترميز مخصّص
تحتاج إلى برنامج فك ترميز مخصّص لأي تنسيق لا يتيحه برنامج فك ترميز توفّره Google. على سبيل المثال:
لإتاحة إطار عمل الوسائط لملفات AVI التي تحتوي على MP3، تحتاج إلى مستخرج AVI ولكن لا تحتاج إلى برنامج فك ترميز MP3 لأنّه متوفّر حاليًا.
لإتاحة إطار عمل الوسائط لملفات AVI التي تحتوي على Windows Media، تحتاج إلى مستخرج AVI وبرنامج فك ترميز Windows Media.
تشبه إضافة برنامج فك ترميز جديد إضافة برامج فك ترميز الأجهزة الخاصة بك لـ AVC أو HEVC.
بينما ينشر المستخرج نوع MIME لمسارات الوسائط التي يحتوي عليها، يجب أن تكون برامج الترميز التي تتيح أنواع MIME هذه متوفّرة لكي يتم إتاحة الملف بالكامل. إنّ سلسلة نوع MIME الفعلية المستخدَمة هي اتفاقية بين المستخرج وبرنامج الترميز (لا يلزم إضافة السلسلة إلى ملف MediaDefs.h).
التكامل مع أداة فحص الوسائط
تبحث أداة فحص الوسائط عن أنواع الملفات الجديدة وتضيفها إلى قاعدة بيانات الوسائط.
لكي تتعامل أداة فحص الوسائط مع نوع الملف المخصّص، يجب أن تكون على علم به. في Android 10 أو الإصدارات الأحدث، تحتفظ MimeUtils (في libcore) بربط امتداد MIME. في السابق، كان يتم التعامل مع هذا الربط في ملف MediaFile.java، الذي لا يزال يحتوي على ربط من نوع MIME إلى ثوابت تنسيق MTP.
يمكن للمستخرج تصدير قائمة بامتدادات أسماء الملفات التي يتيحها (مثل MP3 أو MP4). ومع ذلك، لا تستخدم ذلك سوى LegacyMediaScanner، ولا يؤثر ذلك في ModernMediaScanner، الذي يتم استخدامه تلقائيًا.