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

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

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

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

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

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

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

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