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

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

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

כשמוסיפים חלץ בפורמט חדש, צריך לוודא שהמחלץ תלוי רק ממשקי NDK יציבים ולא תלויים בממשקי API פרטיים. החולצים להטמיע את ה-API שמוגדר על ידי frameworks/av/include/media/MediaExtractorPluginApi.h ויכולים להשתמש במקש C++ ש-wrappers נוח 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, אפשר לאלץ את המסגרת להשתמש בכלי החילוץ: באמצעות הפונקציה Sniff() כדי להחזיר רמת סמך גבוהה יותר מספר ש-Google סיפקה.

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

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

אתה צריך מפענח מותאם אישית לכל פורמט שלא נתמך עדיין על ידי מפענח ש-Google מספקת. לדוגמה:

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