התאמה אישית של רכיבי מדיה

אפשר להרחיב את הרכיבים של חילוץ המדיה וקודק המדיה באמצעות תוספים של ספקים. אי אפשר להתאים אישית את ממשקי ה-API של MediaSession2 ו-MediaParser (אבל אפשר להעביר שינויים למקור לממשקי ה-API הקודמים 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 (עם יחסי תלות מעבריביים) שנמצאת במחיצת הספק. כשתהליך השירות של הקודק של הספק מתחיל, הוא יכול לטעון את נקודת הכניסה ברמה העליונה הזו.

יצירת כלי חילוץ

כשמוסיפים חילוץ לפורמט חדש, חשוב לוודא שהחילוץ תלוי רק בממשקי API יציבים של NDK ולא תלוי בממשקי API פרטיים. כלי החילוץ צריכים להטמיע את ה-API שהוגדר על ידי frameworks/av/include/media/MediaExtractorPluginApi.h ויכולים להשתמש ב-wrappers של נוחות C++ ב-frameworks/av/include/media/MediaExtractorPluginHelper.h. מאחר שגרסת Android 10 ואילך תומכת רק בגרסה הגבוהה ביותר של ה-API של המחולל, חשוב ליצור מודל של המחולל לפי המחולל עם מספר גרסת ה-API הגבוה ביותר.

מציבים כלים מותאמים אישית לחילוץ נתונים ב-/system/lib/64/extractors או ב-APEX של ספק, שנפתח יחד עם Google APEX שמכיל את כלי החילוץ של Google. כדי לוודא שהמסגרת טוענת את ה-extractor, מריצים את הפקודה הבאה.

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 מספקת. לדוגמה:

  • כדי להוסיף תמיכה ב-Media framework לקובצי AVI שמכילים MP3, צריך להשתמש בחולץ AVI, אבל לא צריך במפענח MP3 כי כבר קיים קובץ כזה.

  • כדי להוסיף תמיכה ב-Media framework לקובצי 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, שבו נעשה שימוש כברירת מחדל.