ב-Android 12, המרת קידוד של מדיה תואמת, שהושקה ב-Android 12, היא תכונה שמאפשרת למכשירים להשתמש בפורמטי מדיה מודרניים וחסכוניים יותר לצילום וידאו, כמו HEVC, תוך שמירה על תאימות לאפליקציות. בעזרת התכונה הזו, יצרני מכשירים יכולים להשתמש ב-HEVC במקום ב-AVC כברירת מחדל כדי לשפר את איכות הווידאו תוך צמצום הדרישות לאחסון ורוחב פס. במכשירים שבהם מקודד המדיה תואם מופעל, מערכת Android יכולה להמיר באופן אוטומטי סרטונים (עד דקה אחת באורך) שצולמו בפורמטים כמו HEVC או HDR, כשהסרטונים נפתחים באפליקציה שלא תומכת בפורמט. כך האפליקציות יכולות לפעול גם כשסרטונים צולמו בפורמטים חדשים יותר במכשיר.
התכונה 'המרת קידוד למדיה תואמת' מושבתת כברירת מחדל. כדי לבקש המרה של מדיה, האפליקציות צריכות להצהיר על יכולות המדיה שלהן. למידע נוסף בנושא הצהרה על יכולות מדיה, ראו המרת קידוד של מדיה תואמת באתר של מפתחי Android.
איך זה עובד
תכונת המרת הקידוד התואמת של מדיה מורכבת משני חלקים עיקריים:
- שירותי המרה (Transcoding) במסגרת המדיה: השירותים האלה ממירים קבצים מפורמט אחד לאחר באמצעות חומרה, כדי לספק המרות באיכות גבוהה ובזמן אחזור קצר. הפריטים האלה כוללים את ה-API להמרת הקידוד, שירות המרת הקידוד, פלאגין של OEM (יצרן ציוד מקורי) למסננים מותאמים אישית וחומרה. פרטים נוספים זמינים במאמר סקירה כללית על הארכיטקטורה.
- תכונה תואמת להמרת קידוד של מדיה בספקי מדיה: הרכיב הזה שנמצא בספקי מדיה מיירט אפליקציות שניגשים לקובצי מדיה, ומציג את הקובץ המקורי או קובץ שעבר המרת קידוד בהתאם ליכולות המוצהרות של האפליקציה. אם אפליקציה תומכת בפורמט של קובץ המדיה, לא נדרשת טיפול מיוחד. אם אפליקציה לא תומכת בפורמט, המסגרת ממירה את הקובץ לפורמט ישן יותר, כמו AVC, כשהאפליקציה ניגשת לקובץ.
איור 1 מציג סקירה כללית של תהליך המרת הקידוד של המדיה.
איור 1. סקירה כללית של המרת קידוד של מדיה תואמת.
פורמטים נתמכים
התכונה 'המרת קידוד למדיה תואמת' תומכת בהמרות הפורמטים הבאות:
- HEVC (8 ביט) ל-AVC: המרות הקודקים מתבצעות על ידי חיבור של מפענח mediacodec אחד ומקודד mediacode אחד.
- HDR10+ (10 ביט) ל-AVC (SDR): המרות מ-HDR ל-SDR מתבצעות באמצעות מכונות של mediacodec ו-hook של פלאגין של ספק במכונות של המפענח. מידע נוסף זמין במאמר בנושא קידוד HDR ל-SDR.
מקורות תוכן נתמכים
התכונה 'המרת מדיה תואמת' תומכת במדיה במכשיר שנוצרה על ידי אפליקציית המצלמה המקורית של יצרן הציוד המקורי (OEM) ושמורה בתיקייה DCIM/Camera/
בנפח האחסון החיצוני הראשי. התכונה לא תומכת במדיה באחסון משני.
אין תמיכה בתוכן שמועברים למכשירים באמצעות אימייל או כרטיסי SD.
אפליקציות ניגשות לקבצים על סמך נתיבי קבצים שונים. בהמשך מפורטים נתיבי הקבצים שבהם ההמרה מקודדת מופעלת או עוקפת:
המרת הקידוד מופעלת:
- גישה לאפליקציות דרך ממשקי API של MediaStore
- גישה של אפליקציות דרך ממשקי API ישירים של נתיב קובץ, כולל Java וקוד מקורי
- גישה לאפליקציות דרך Storage Access Framework (SAF)
- גישה לאפליקציה דרך רשימת ה-Intents של גיליון השיתוף של מערכת ההפעלה. (MediaStore URI בלבד)
- העברת קובץ MTP/PTP מטלפון למחשב
בוצעה עקיפה של המרת הקידוד:
- העברת קבצים ממכשיר על ידי הוצאת כרטיס ה-SD
- העברת קבצים ממכשיר למכשיר באמצעות אפשרויות כמו 'שיתוף בקרבת מקום' או העברה ב-Bluetooth.
הוספת נתיבי קבצים מותאמים אישית להמרה
יצרני המכשירים יכולים להוסיף נתיבי קבצים להמרת מדיה בתיקייה DCIM/
. כל הנתיבים מחוץ לספרייה DCIM/
נדחים.
יכול להיות שתצטרכו להוסיף נתיבי קבצים כאלה כדי לעמוד בדרישות של הספק או בתקנות המקומיות.
כדי להוסיף נתיב קובץ, משתמשים בנתיב ההמרה של שכבת-על של משאבים בסביבת זמן ריצה (RRO), config_supported_transcoding_relative_paths
. הדוגמה הבאה היא להוספת נתיב קובץ:
<string-array name="config_supported_transcoding_relative_paths" translatable="false">
<item>DCIM/JCF/</item>
</string-array>
כדי לאמת את נתיבי הקבצים שהוגדרו, משתמשים בפקודה:
adb shell dumpsys activity provider com.google.android.providers.media.module/com.android.providers.media.MediaProvider | head -n 20
סקירה כללית של הארכיטקטורה
בקטע הזה מתוארת הארכיטקטורה של תכונת המרת הקידוד של מדיה.
איור 2. הארכיטקטורה של המרת קידוד של מדיה.
הארכיטקטורה של המרת קידוד של מדיה מורכבת מהרכיבים הבאים:
- MediaTranscodingManager system API: ממשק שמאפשר ללקוח לתקשר עם שירות MediaTranscoding. המודול MediaProvider משתמש ב-API הזה.
- MediaTranscodingService: שירות נייטיב שמנהל את החיבורים של הלקוחות, מתזמן בקשות להמרת קידוד ומנהל את הנהלת החשבונות עבור
TranscodingSessions
. - MediaTranscoder: ספרייה מותאמת שמבצעת המרת קידוד. הספרייה הזו מבוססת על NDK של מסגרת המדיה כדי להיות תואמת למודולים.
התכונה 'המרת קידוד למדיה תואמת' מתעדת מדדי המרת קידוד גם בשירות וגם במקודד המדיה. הקוד בצד הלקוח והקוד בצד השירות נמצאים במודול MediaProvider, כדי לאפשר תיקוני באגים ועדכונים מדויקים.
גישה לקבצים
המרת מדיה תואמת מבוססת על מערכת הקבצים של Filesystem in Userspace (FUSE), שמשמשת לאחסון מוגדר-היקף. FUSE מאפשר למודול MediaProvider לבדוק פעולות הקובץ במרחב המשתמש ולסנן את הגישה לקבצים על סמך המדיניות, כדי לאשר, לדחות או לצנזר את הגישה.
כשאפליקציה מנסה לגשת לקובץ, הדימון (daemon) של FUSE מיירט את הגישה לקריאת הקובץ מהאפליקציה. אם האפליקציה תומכת בפורמט חדש יותר (כמו HEVC), הקובץ המקורי מוחזר. אם האפליקציה לא תומכת בפורמט, הקובץ יועבר קודיפיקציה לפורמט ישן יותר (כמו AVC) או יוחזר מהמטמון אם יש גרסה מקודדת זמינה.
בקשת קבצים שהומרו
כברירת מחדל, תכונת המרת הקידוד התואמת של מדיה מושבתת. כלומר, אם המכשיר תומך ב-HEVC, מערכת Android לא ממירה קידוד של קבצים, אלא אם האפליקציה צוינה בקובץ מניפסט או ברשימת המרת הקידוד.
אפליקציות יכולות לבקש נכסים שהקידוד שלהם הומר באמצעות האפשרויות הבאות:
- יש להצהיר על פורמטים לא נתמכים בקובץ המניפסט. למידע נוסף, ראו הצהרה על יכולות במשאב והצהרה על יכולות בקוד.
- מוסיפים אפליקציות לרשימת המרת הקידוד של הכוח שכלולה במודול MediaProvider. כך תוכלו להפעיל המרה לאפליקציות שלא עדכנו את קובץ המניפסט שלהן. אחרי שאפליקציה מעדכנת את קובץ המניפסט בפורמטים לא נתמכים, צריך להסיר אותה מרשימת אילוץ המרת הקידוד. יצרני מכשירים יכולים להציע את האפליקציות שלהם להוספה או להסרה מרשימת כוח הקידוד של האפליקציות על ידי שליחת תיקון או על ידי דיווח על באג. צוות Android בודק מדי פעם את הרשימה ועשוי להסיר אפליקציות מהרשימה.
- השבתת הפורמטים הנתמכים באמצעות מסגרת התאימות של האפליקציה בזמן הריצה (המשתמשים יכולים להשבית את האפשרות הזו גם לכל אפליקציה בהגדרות).
- פותחים קובץ עם
MediaStore
ומציינים באופן מפורש פורמטים לא נתמכים באמצעות ה-API שלopenTypedAssetFileDescriptor
.
בהעברות USB (מכשיר למחשב), ההמרה מקודק לקודק אחר מושבתת כברירת מחדל, אבל המשתמשים יכולים להפעיל אותה באמצעות המתג Convert videos to AVC (המרת סרטונים ל-AVC) במסך ההגדרות USB Preferences (העדפות USB), כפי שמוצג באיור 3.
איור 3. מפעילים את המתג כדי להפעיל המרת קידוד מדיה במסך ההעדפות של USB.
הגבלות על שליחת בקשות לקבצים שהומרו
כדי למנוע מצב שבו בקשות להמרת קוד יגרמו לנעילת משאבי המערכת לפרקי זמן ממושכים, אפליקציות שמבקשות סשנים של המרת קוד מוגבלות ל:
- 10 סשנים ברצף
- משך הפעלה כולל של שלוש דקות
אם אפליקציה חורגת מכל ההגבלות האלה, המסגרת מחזירה את מתאר הקובץ המקורי.
דרישות לגבי מכשירים
כדי לתמוך בתכונה התואמת של המרת קידוד של מדיה, המכשירים צריכים לעמוד בדרישות הבאות:
- קידוד HEVC מופעל כברירת מחדל במכשיר באפליקציית המצלמה המקורית
- (מכשירים שתומכים בהמרת קידוד מ-HDR ל-SDR) המכשיר תומך בצילום סרטון HDR
כדי להבטיח את ביצועי המכשיר להמרת קידוד של מדיה, צריך לבצע אופטימיזציה לביצועים של גישת קריאה/כתיבה לחומרת הווידאו ולאחסון. כשמגדירים לקודקי מדיה עדיפות שווה ל-1
, הקודקים חייבים לפעול בקצב העברת הנתונים הגבוה ביותר האפשרי. מומלץ שהביצועים של ההמרה יספקו לפחות 200fps. כדי לבדוק את ביצועי החומרה, כדאי להפעיל את נקודת ההשוואה של מקודד המדיה בכתובת frameworks/av/media/libmediatranscoding/transcoder/benchmark
.
אימות
כדי לאמת את תכונת המרת הקידוד התואמת של המדיה, מריצים את בדיקות ה-CTS הבאות:
android.media.mediatranscoding.cts
android.mediaprovidertranscode.cts
הפעלת המרת קידוד מדיה באופן גלובלי
כדי לבדוק את מסגרת המרת הקידוד של המדיה או את התנהגות האפליקציה עם המרת קידוד, אפשר להפעיל או להשבית את התכונה 'המרת קידוד למדיה תואמת' ברמת החשבון. בדף האפשרויות למפתחים הגדרות > מערכת > מפתח > המרת קידוד של מדיה, מעבירים את המתג שינוי ברירות המחדל של המרת קידוד למצב מופעל ואז מעבירים את המתג הפעלת המרת קידוד למצב מופעל או מושבת. אם ההגדרה הזו מופעלת, המרת הקידוד של המדיה עשויה להתרחש ברקע של אפליקציות אחרות מאלה שאתם מפתחים.
בדיקת הסטטוס של המרת הקידוד
במהלך הבדיקה, אפשר להשתמש בפקודה הבאה של מעטפת ADB כדי לבדוק את סטטוס ההמרה, כולל סשנים קיימים וקודמים של המרה:
adb shell dumpsys media.transcoding
הארכת משך הזמן של הסרטון
למטרות בדיקה, ניתן להאריך את המגבלה על אורך הסרטון של דקה אחת לצורך המרת קידוד באמצעות הפקודה הבאה. יכול להיות שתצטרכו להפעיל מחדש את המכשיר אחרי שתפעילו את הפקודה הזו.
adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>
מקורות ומסמכי עזר של AOSP
בהמשך מופיע קוד המקור של AOSP שקשור להמרת קידוד למדיה תואמת.
ממשק API של מערכת המרת קידוד (בשימוש רק על ידי MediaProvider)
API של ApplicationMediaCapabilities
frameworks/base/apex/media/framework/java/android/media/ApplicationMediaCapabilities.java
שירות MediaTranscoding
frameworks/av/services/mediatranscoding/
frameworks/av/media/libmediatranscoding/
Native MediaTranscoder
frameworks/av/media/libmediatranscoding/transcoder
פלאגין לדוגמה של HDR עבור MediaTranscoder
קוד יירוט קובץ והמרת קידוד של קובץ MediaProvider
בנצ'מרק של MediaTranscoder
frameworks/av/media/libmediatranscoding/transcoder/benchmark
בדיקות CTS
cts/tests/tests/mediatranscoding/
קידוד מ-HDR ל-SDR
כדי לתמוך בקידוד מ-HDR ל-SDR, יצרני המכשירים יכולים להשתמש בפלאגין לדוגמה של מסנן Codec 2.0 ב-AOSP שנמצא ב-/platform/frameworks/av/media/codec2/hidl/plugin/
.
בקטע הזה נסביר איך פועל הפלאגין של המסנן, איך מטמיעים אותו ואיך בודקים אותו.
אם במכשיר אין פלאגין שתומך בקידוד HDR ל-SDR, אפליקציה שניגשת לסרטון HDR מקבלת את מתאר הקובץ המקורי ללא קשר ליכולות המדיה של האפליקציה שהוצהרו במניפסט.
איך זה עובד
בקטע הזה מתוארת ההתנהגות הכללית של פלאגין המסנן Codec 2.0.
רקע
Android מספק הטמעה של שכבת התאמה בין הממשק Codec 2.0 לממשק ה-HAL של android.hardware.media.c2
ב-android::hardware::media::c2
. ב-AOSP יש מנגנון עטיפה ל-plug-ins של מסננים, שמארז את המקודדים יחד עם ה-plug-ins של המסננים.
MediaCodec
מזהה את הרכיבים העטופים האלה כמפענחים עם תכונות סינון.
סקירה כללית
הכיתה FilterWrapper
מקבלת קודיקים של ספקים ומחזירה קודיקים עטופים לשכבת ההתאמה media.c2
. הכיתה FilterWrapper
טוענת את libc2filterplugin.so
דרך ה-API של FilterWrapper::Plugin
ומתעדת את המסננים הזמינים מהפלאגין. בתהליך היצירה, FilterWrapper
מפעיל את כל המסננים הזמינים. רק מסננים שמשנים את מאגר הנתונים הזמני מופעלים בהתחלה.
איור 1. ארכיטקטורת הפלאגין של המסנן.
ממשק הפלאגין של המסנן
הממשק FilterPlugin.h
מגדיר את ממשקי ה-API הבאים כדי לחשוף את המסננים:
std::shared_ptr<C2ComponentStore>getComponentStore()
מחזירה אובייקט
C2ComponentStore
שמכיל מסננים. זה נפרד ממה שהטמעת ה-Codec 2.0 של הספק חושפת. בדרך כלל, המאגר הזה מכיל רק את המסננים שבהם משתמשת הכיתהFilterWrapper
.bool describe(C2String name, Descriptor *desc)
תיאור המסננים בנוסף למה שזמין מ-
C2ComponentStore
. התיאורים הבאים מוגדרים:controlParam
: פרמטרים ששולטים בהתנהגות המסננים. לדוגמה, בשביל מיפוי טונים מ-HDR ל-SDR, פרמטר הבקרה הוא הפונקציה של העברת היעד.affectedParams
: פרמטרים שמושפעים מפעולות הסינון. לדוגמה, כשמשתמשים במיפוי טונים מ-HDR ל-SDR, הפרמטרים המושפעים הם ההיבטים של הצבעים.
bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)
הפונקציה מחזירה את הערך
true
אם רכיב המסנן משנה את המאגר. לדוגמה, המסנן למיפוי גוונים מחזיר את הערךtrue
אם הפונקציה להעברת היעד היא SDR והפונקציה להעברת קלט היא HDR (HLG או PQ).
פרטי FilterWrapper
בקטע הזה מתוארים פרטי הכיתה FilterWrapper
.
יצירה
הרכיב המארז יוצר את המפענח הבסיסי ואת כל המסננים שהוגדרו בזמן היצירה.
שאילתה והגדרה
הרכיב הארוז מפריד בין הפרמטרים הנכנסים לבין השאילתות או הבקשות להגדרות בהתאם לתיאור המסנן. לדוגמה, ההגדרה של פרמטר הבקרה של המסנן מנותבת למסנן המתאים, והפרמטרים המושפעים מהמסננים נמצאים בשאילתות (במקום קריאה מהפעמון שיש לו פרמטרים שלא הושפעו).
איור 2. שאילתה והגדרות אישיות.
התחלה
בהתחלה, הרכיב הארוז מפעיל את המפענח ואת כל המסננים שמשנים את מאגר הנתונים הזמני. אם לא מופעל מסנן, הרכיב הארוז מפעיל את המפענח ואת אגירת הנתונים הזמניים ושולח פקודות למפענח עצמו.
טיפול במאגר נתונים זמני
איור 3. טיפול במאגר הנתונים הזמני.
מאגרי נתונים זמניים שממתינים בתור למפענח הארוז מועברים למפענח הבסיסי. הרכיב הארוז לוקח את מאגר הנתונים הזמני של המפענח מהמפענח באמצעות קריאה חוזרת (callback) של onWorkDone_nb()
, ואז מכניס אותו לתור למסננים. מאגר הפלט הסופי מהמסנן האחרון מדווח ללקוח.
כדי שהטיפול במאגרים יפעל, צריך להגדיר את C2PortBlockPoolsTuning
לרכיב המארז למסנן האחרון, כך שמאגרי הפלט של המסגרת יאוחסנו ממאגר הבלוקים הצפוי.
עצירה, איפוס ושחרור
בסיום, הרכיב הארוז עוצר את המפענח ואת כל המסננים הפעילים שהופעלו. במהלך האיפוס והשחרור, כל הרכיבים מתאפסים או משתחררים, ללא קשר לסטטוס ההפעלה שלהם.
הטמעת הפלאגין של המסנן לדוגמה
כדי להפעיל את הפלאגין:
- מטמיעים את הממשק
FilterPlugin
בספרייה ומשחררים אותו בכתובת/vendor/lib[64]/libc2filterplugin.so.
- מוסיפים הרשאות נוספות לאפליקציה
mediacodec.te
לפי הצורך. - מעדכנים את שכבת ההתאמה ל-Android 12 ומגדירים מחדש את השירות
media.c2
.
בדיקת הפלאגין
כדי לבדוק את הפלאגין לדוגמה:
- בונים מחדש את המכשיר ומעדכנים אותו.
יוצרים את הפלאגין לדוגמה באמצעות הפקודה הבאה:
m sample-codec2-filter-plugin
טוענים מחדש את המכשיר ומשנים את השם של הפלאגין של הספק כדי שהוא יזוהה על ידי שירות הקודק.
adb root adb remount adb reboot adb wait-for-device adb root adb remount adb push /out/target/<...>/lib64/sample-codec2-filter-plugin.so \ /vendor/lib64/libc2filterplugin.so adb push /out/target/<...>/lib/sample-codec2-filter-plugin.so \ /vendor/lib/libc2filterplugin.so adb reboot