تخصيص مكوّنات الوسائط

يمكنك توسيع نطاق مكوّنَي مستخرج الوسائط وبرنامج ترميز الوسائط باستخدام إضافات المورّد. لا يمكن تخصيص واجهتَي برمجة التطبيقات MediaSession2 وMediaParser (ولكن يمكنك إرسال تغييرات إلى المصدر لواجهتَي برمجة التطبيقات القديمتَين MediaPlayer وMediaSession).

لإتاحة أنواع وسائط إضافية في إطار عمل الوسائط في Android، عليك إنشاء مستخرِج وبرنامج ترميز مخصّصَين. على سبيل المثال، لإتاحة استخدام فيديو Windows Media في ملفات AVI، عليك إنشاء مستخرِج لملفات AVI وبرنامج ترميز لفيديو 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. بما أنّ الإصدار 10 من نظام التشغيل Android أو الإصدارات الأحدث لا تتوافق إلا مع أحدث إصدار من واجهة برمجة التطبيقات الخاصة بأداة الاستخراج، احرص على تصميم أداة الاستخراج الخاصة بك وفقًا لأداة الاستخراج التي تحمل أعلى رقم إصدار لواجهة برمجة التطبيقات.

ضَع أدوات الاستخراج المخصّصة في /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 الذي يتم استخدامه تلقائيًا.