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

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

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 סיפקה, תוכלו לאלץ את ה-framework להשתמש במחלץ באמצעות הפונקציה Sniff() כדי להחזיר רמת סמך גבוהה יותר מזו ש-Google סיפקה.

כשמסגרת המדיה טוענת את כלי החילוץ (מ-/system/lib/64/extractors או מ-APEX של ספק), היא מזהה את הקובץ ומקבלת מידע על התוכן שלו. בשלב הבא מוסיפים מפענח לפורמט כדי שה-framework יוכל להבין איך לנתח את תוכן הקובץ.

יצירת מפענח בהתאמה אישית

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