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

يمكنك توسيع مستخرج الوسائط ومكونات برنامج ترميز الوسائط باستخدام ملحقات البائع. لا يمكن تخصيص واجهات برمجة تطبيقات 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 . نظرًا لأن Android 10 أو أعلى يدعم فقط الإصدار الأعلى من واجهة برمجة التطبيقات للمستخرج ، تأكد من تصميم المستخرج الخاص بك بعد المستخرج بأعلى رقم إصدار لواجهة برمجة التطبيقات.

ضع المستخلصات المخصصة في /system/lib/64/extractors أو بائع APEX ، والذي يتم فتحه مع Google APEX الذي يحتوي على مستخلصات 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 extrator ووحدة فك ترميز Windows Media.

تشبه إضافة وحدة فك ترميز جديدة إضافة وحدات فك ترميز الأجهزة الخاصة بك لـ AVC أو HEVC.

بينما ينشر المستخرج نوع MIME لمسارات الوسائط التي يحتوي عليها ، يجب أن تكون برامج الترميز التي تدعم أنواع MIME هذه موجودة حتى يتم دعم الملف بالكامل. سلسلة نوع MIME الفعلية المستخدمة هي بشكل صارم اتفاقية بين المستخرج وبرنامج الترميز (لا يلزم إضافة السلسلة إلى ملف MediaDefs.h ).

التكامل مع الماسح الضوئي للوسائط

يبحث ماسح الوسائط عن أنواع الملفات الجديدة ويضيفها إلى قاعدة بيانات الوسائط. لجعل الماسح الضوئي للوسائط يتعامل مع نوع الملف المخصص الخاص بك ، يحتاج الماسح الضوئي إلى معرفة ذلك. في Android 10 أو إصدار أحدث ، MimeUtils (في libcore ) على تعيين MIME-to-extension. في السابق ، تمت معالجة هذا التعيين في ملف MediaFile.java ، والذي يستمر في احتوائه على تعيين من نوع MIME إلى ثوابت تنسيق MTP.

يمكن للمستخرج تصدير قائمة بامتدادات أسماء الملفات التي يدعمها (مثل MP3 أو MP4). ومع ذلك ، يستخدم LegacyMediaScanner فقط ذلك ؛ ليس له أي تأثير على ModernMediaScanner ، والذي يستخدم افتراضيًا.