אפשר להרחיב את רכיבי חילוץ המדיה ורכיבי קודק המדיה באמצעות תוספים של ספקים. אי אפשר להתאים אישית את ממשקי ה-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, וכך לכפות על המסגרת להשתמש במחלץ שלכם.
כשמסגרת המדיה טוענת את כלי החילוץ (מ-/system/lib/64/extractors
או מ-APEX של ספק), היא מזהה את הקובץ ומקבלת מידע על התוכן שלו. השלב הבא הוא להוסיף מפענח לפורמט, כדי שהמסגרת תוכל להבין איך לנתח את תוכן הקובץ.
יצירת פענוח בהתאמה אישית
צריך להשתמש במפענח בהתאמה אישית לכל פורמט שלא נתמך כבר על ידי מפענח שסופק על ידי Google. לדוגמה:
כדי להוסיף תמיכה במסגרת מדיה לקובצי AVI שמכילים MP3, צריך כלי לחילוץ AVI, אבל לא צריך מפענח MP3 כי כבר קיים כזה.
כדי להוסיף תמיכה ב-framework של מדיה לקובצי 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
, שמשמשת כברירת מחדל.