يمكنك توسيع مكونات أداة استخراج الوسائط وبرنامج ترميز الوسائط باستخدام ملفَّات
إضافات المصنّع. لا يمكن تخصيص واجهات برمجة التطبيقات 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 (التي تتضمّن تبعيات ناتجة) تكون مضمّنة في قسم
المورّد. عند بدء عملية خدمة ترميز المورّد، يمكنها بعد ذلك تحميل نقطة دخول
هذا المستوى الأعلى.
إنشاء أداة استخراج
عند إضافة أداة استخراج لتنسيق جديد، تأكَّد من أنّ الأداة لا تعتمد إلا على IDE لواجهة برمجة التطبيقات (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
).
الدمج مع الماسح الضوئي للوسائط
يبحث الماسح الضوئي للوسائط عن أنواع ملفات جديدة ويضيفها إلى قاعدة بيانات الوسائط.
لكي يتعامل الماسح الضوئي للوسائط مع نوع ملفك المخصّص، يجب أن يعرف الماسح الضوئي
بهذا النوع. في الإصدار 10 من نظام التشغيل Android أو الإصدارات الأحدث، يحافظ MimeUtils
(في
libcore
) على تعيين تنسيق MIME إلى الإضافة. في السابق، كان يتم التعامل مع عملية الربط هذه
في ملف MediaFile.java
الذي لا يزال يحتوي على عملية ربط من نوع
MIME إلى ثوابت تنسيق MTP.
يمكن لأداة الاستخراج تصدير قائمة بامتدادات أسماء الملفات المتوافقة معها (مثل MP3
أو MP4). ومع ذلك، لا يستخدم سوى LegacyMediaScanner
هذا الإعداد، ولا يؤثّر في
ModernMediaScanner
الذي يتم استخدامه تلقائيًا.