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

אפשר להרחיב את הרכיבים של חילוץ המדיה וקודק המדיה באמצעות תוספים של ספקים. אי אפשר להתאים אישית את ממשקי ה-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 של ספק, שנפתח יחד עם ה-APEX של Google שמכיל את חילוצי הנתונים של 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 מספקת. לדוגמה:

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