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

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

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

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

אם ה-extractor המותאם אישית תומך בפורמט שכבר נתמך על ידי ה-extractor ש-Google מספקת, אפשר לאלץ את המסגרת להשתמש ב-extractor שלכם באמצעות הפונקציה Sniff() כדי להחזיר רמת ביטחון גבוהה יותר מזו של ה-extractor ש-Google מספקת.

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

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

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