אפשר להרחיב את הרכיבים של כלי החילוץ של המדיה ושל קודק המדיה באמצעות תוספים של ספקים. אי אפשר להתאים אישית את ממשקי ה-API MediaSession2 ו-MediaParser (אבל אפשר להעביר שינויים במעלה הזרם עבור ממשקי ה-API מדור קודם MediaPlayer ו-MediaSession).
כדי לתמוך בסוגי מדיה נוספים במסגרת המדיה של Android, צריך ליצור כלי חילוץ ומפענח בהתאמה אישית. לדוגמה, כדי להוסיף תמיכה בסרטון Windows Media בקובצי AVI, צריך ליצור Extractor של AVI ו-Decoder של סרטון Windows Media.
על תוספים
אם מחלצי המדיה שמוגדרים כברירת מחדל לא עונים על הדרישות שלכם, אתם יכולים למקם תוספים לחילוץ מותאם אישית ב-/system/lib[64]/extractors/. תהליך החילוץ טוען באופן אוטומטי תוספים לחילוץ מחבילת ה-APEX שסופקה על ידי Google ומ-/system/lib[64]/extractors/.
באופן דומה, אתם יכולים להגדיר שירותים מותאמים אישית של רכיבי codec למדיה שמשתמשים בממשק Codec 2.0 שמוגדר ב-frameworks/av/media/codec2/core/. למידע על הטמעה בסיסית, אפשר לעיין במאמר frameworks/av/media/codec2/hidl/services/. נקודת הכניסה לספרייה היא הממשק C2ComponentStore. לדוגמה, אפשר לעיין בהטמעה של חנות ברירת המחדל של רכיב codec בתוכנה בכתובת frameworks/av/media/codec2/vndk/C2Store.cpp.
כשמשתמשים ב-APEX משלכם, צריך לבנות את שירות ה-codec ולטעון את קובץ ה-APEX באמצעות אותם תהליכים שבהם משתמשים בשירות mediaswcodec. כדי לעשות זאת, צריך להגדיר ספרייה משותפת ברמה העליונה שאחראית לרישום כל רכיבי C2, ואז ליצור חבילת APEX (עם יחסי תלות טרנזיטיביים) שנמצאת במחיצת הספק. כשתהליך שירות קודק הספק מתחיל, הוא יכול לטעון את נקודת הכניסה ברמה העליונה.
יצירת כלי לחילוץ נתונים
כשמוסיפים כלי לחילוץ נתונים בפורמט חדש, צריך לוודא שכלי החילוץ מסתמך רק על ממשקי API יציבים של NDK ולא מסתמך על ממשקי API פרטיים. הכלי לחילוץ צריך להטמיע את ה-API שמוגדר ב-frameworks/av/include/media/MediaExtractorPluginApi.h, ויכול להשתמש במעטפות הנוחות של C++ ב-frameworks/av/include/media/MediaExtractorPluginHelper.h. מכיוון שגרסה Android 10 ואילך תומכת רק בגרסה הכי גבוהה של ה-API לחילוץ, חשוב ליצור מודל של כלי החילוץ לפי כלי החילוץ עם מספר הגרסה הכי גבוה של ה-API.
ממקמים מחלצים מותאמים אישית ב-/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, וכך לכפות על ה-framework להשתמש במחלץ שלכם.
כשמסגרת המדיה טוענת את כלי החילוץ שלכם (מ-/system/lib/64/extractors
או מ-APEX של ספק), היא מזהה את הקובץ ומקבלת מידע על התוכן שלו. השלב הבא הוא להוסיף מפענח לפורמט, כדי שהמסגרת תוכל להבין איך לנתח את תוכן הקובץ.
יצירת מפענח בהתאמה אישית
אתם צריכים מפענח בהתאמה אישית לכל פורמט שלא נתמך כבר על ידי מפענח שסופק על ידי Google. לדוגמה:
כדי להוסיף תמיכה במסגרת מדיה לקובצי AVI שמכילים MP3, צריך כלי לחילוץ AVI, אבל לא צריך מפענח MP3 כי כזה כבר קיים.
כדי להוסיף תמיכה במסגרת מדיה לקובצי AVI שמכילים Windows Media, צריך גם כלי לחילוץ AVI וגם מפענח Windows Media.
הוספה של מפענח חדש דומה להוספה של מפענחי חומרה משלכם עבור AVC או HEVC.
הכלי לחילוץ מפרסם את סוג ה-MIME של רצועות המדיה שהוא מכיל, אבל כדי שהקובץ ייתמך באופן מלא, צריך שיהיו בו רכיבי codec שתומכים בסוגי ה-MIME האלה. מחרוזת סוג ה-MIME בפועל שבה נעשה שימוש היא הסכם בין כלי החילוץ לבין הקודק (אין צורך להוסיף את המחרוזת לקובץ MediaDefs.h).
שילוב עם סורק המדיה
סורק המדיה מחפש סוגי קבצים חדשים ומוסיף אותם למסד הנתונים של המדיה.
כדי שסורק המדיה יטפל בסוג הקובץ המותאם אישית, הסורק צריך לדעת על כך. ב-Android מגרסה 10 ואילך, MimeUtils (ב-libcore) שומר על המיפוי של MIME לסיומת. בעבר, המיפוי הזה בוצע בקובץ MediaFile.java, שממשיך להכיל מיפוי מסוג MIME לקבועים בפורמט MTP.
כלי לחילוץ יכול לייצא רשימה של סיומות שמות קבצים שהוא תומך בהן (כמו MP3 או MP4). עם זאת, רק LegacyMediaScanner משתמש בזה. אין לזה השפעה על ModernMediaScanner, שמשמש כברירת מחדל.