קידוד מדיה תואם

המרת מדיה תואמת, שהוצגה באנדרואיד 12, היא תכונה המאפשרת למכשירים להשתמש בפורמטי מדיה מודרניים ויעילים יותר עבור צילום וידאו, כגון HEVC, תוך שמירה על תאימות עם אפליקציות. עם תכונה זו, יצרני מכשירים יכולים להשתמש ב-HEVC במקום ב-AVC כברירת מחדל כדי לשפר את איכות הווידאו תוך הפחתת דרישות האחסון ורוחב הפס. עבור מכשירים עם המרת מדיה תואמת מופעלת, אנדרואיד יכולה להמיר אוטומטית סרטונים (באורך של עד דקה אחת) שהוקלטו בפורמטים כגון HEVC או HDR כאשר הסרטונים נפתחים על ידי אפליקציה שאינה תומכת בפורמט. זה מאפשר לאפליקציות לתפקד גם כאשר סרטונים נלכדים בפורמטים חדשים יותר במכשיר.

תכונת ההמרה של מדיה תואמת כבויה כברירת מחדל. כדי לבקש המרת מדיה, אפליקציות חייבות להצהיר על יכולות המדיה שלהן. למידע נוסף על הצהרת יכולות מדיה, ראה המרת קידוד מדיה תואמת באתר מפתחי אנדרואיד.

איך זה עובד

תכונת ההמרה של מדיה תואמת מורכבת משני חלקים עיקריים:

  • שירותי המרת קידוד במסגרת המדיה: שירותים אלו ממירים קבצים מפורמט אחד למשנהו באמצעות חומרה להשהייה נמוכה והמרות באיכות גבוהה. זה כולל את ה-API של ההמרה, שירות ההמרה, תוסף OEM עבור מסננים מותאמים אישית וחומרה. לפרטים נוספים, ראה סקירת אדריכלות .
  • תכונת המרת מדיה תואמת בספקי מדיה: רכיב זה שנמצא בספקי מדיה מיירט אפליקציות הניגשות לקבצי מדיה ומגיש את הקובץ המקורי או קובץ מקודד על סמך היכולות המוצהרות של האפליקציה. אם אפליקציה תומכת בפורמט של קובץ המדיה, אין צורך בטיפול מיוחד. אם אפליקציה לא תומכת בפורמט, המסגרת ממירה את הקובץ לפורמט ישן יותר, כגון AVC, כאשר האפליקציה ניגשת לקובץ.

איור 1 מציג סקירה כללית של תהליך המרת המדיה.

תהליך המרת מדיה תואם

איור 1. סקירה כללית של המרת מדיה תואמת.

פורמטים נתמכים

תכונת המרת המדיה התואמת תומכת בהמרות הפורמט הבאות:

  • HEVC (8 סיביות) ל-AVC: המרות Codec מבוצעות באמצעות חיבור מפענח מדיה-קודק אחד ומקודד מדיה-קוד אחד.
  • HDR10+ (10 סיביות) ל-AVC (SDR): המרות HDR ל-SDR מבוצעות באמצעות מופעי מדיה-קודקים וחיבור תוסף של הספק למופעי המפענח. למידע נוסף, ראה קידוד HDR ל-SDR .

מקורות תוכן נתמכים

תכונת ההמרה של מדיה תואמת תומכת במדיה במכשיר שנוצרת על ידי אפליקציית המצלמה המקורית של OEM המאוחסנת בתיקיית DCIM/Camera/ בנפח חיצוני ראשי. התכונה אינה תומכת במדיה באחסון משני. תוכן המועבר למכשירים באמצעות אימייל או כרטיסי SD אינם נתמכים.

אפליקציות ניגשים לקבצים על סמך נתיבי קבצים שונים. להלן מתארים את נתיבי הקבצים שבהם ההמרה מופעל או עוקף:

  • המרת קידוד מופעל:

    • גישה לאפליקציה דרך ממשקי API של MediaStore
    • גישה לאפליקציה דרך ממשקי API ישירים של נתיב קבצים כולל Java וקוד מקורי
    • גישה לאפליקציה דרך מסגרת הגישה לאחסון (SAF)
    • גישה לאפליקציה דרך גיליון השיתוף של מערכת ההפעלה Intents. (URI של MediaStore בלבד)
    • העברת קבצי MTP/PTP מהטלפון למחשב
  • המרת קידוד עקף:

    • העברת קובץ ממכשיר על ידי הוצאת כרטיס ה-SD
    • העברת קבצים ממכשיר למכשיר באמצעות אפשרויות כגון Nearby Share או העברת 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 כדי לאפשר תיקוני באגים ועדכונים בזמן.

גישה לקובץ

קידוד מדיה תואם נבנה על גבי מערכת הקבצים ב-Userspace (FUSE) , המשמשת לאחסון בהיקף. FUSE מאפשר למודול MediaProvider לבחון את פעולות הקבצים במרחב המשתמש ולהגדיר גישה לקבצים על סמך המדיניות לאפשר, לדחות או לבטל גישה.

כאשר אפליקציה מנסה לגשת לקובץ, הדמון FUSE מיירט את גישת הקריאה של הקובץ מהאפליקציה. אם האפליקציה תומכת בפורמט חדש יותר (כגון HEVC), הקובץ המקורי מוחזר. אם האפליקציה לא תומכת בפורמט, הקובץ מועבר לפורמט ישן יותר (כגון AVC) או מוחזר מהמטמון אם זמינה גרסה מקודדת.

בקש קבצים מקודדים

תכונת ההמרה התואמת של מדיה מושבתת כברירת מחדל, כלומר אם המכשיר תומך ב-HEVC, אנדרואיד לא מקודדת קבצים אלא אם צוין על ידי אפליקציה בקובץ מניפסט או ברשימת ההמרה הכפויה .

אפליקציות יכולות לבקש נכסים מקודדים באמצעות האפשרויות הבאות:

  • הכריז על פורמטים לא נתמכים בקובץ המניפסט. לפרטים, ראה הצהרת יכולות במשאב והצהרת יכולות בקוד .
  • הוסף יישומים לרשימת ההמרה בכפייה הכלולה במודול MediaProvider . זה מאפשר המרת קידוד עבור אפליקציות שלא עדכנו את קובץ המניפסט שלהן. ברגע שאפליקציה מעדכנת את קובץ המניפסט שלה בפורמטים לא נתמכים, יש להסיר אותו מרשימת ההמרה הכפויה. יצרני מכשירים יכולים למנות את האפליקציות שלהם להוספה או הסרה מרשימת ההמרה הכפויה על ידי שליחת תיקון או על ידי דיווח על באג . צוות אנדרואיד סוקר את הרשימה מעת לעת ועשוי להסיר אפליקציות מהרשימה.
  • השבת פורמטים נתמכים עם מסגרת תאימות האפליקציה בזמן ריצה (משתמשים יכולים גם להשבית זאת עבור כל אפליקציה בהגדרות).
  • פתח קובץ עם MediaStore תוך ציון מפורש של פורמטים לא נתמכים עם openTypedAssetFileDescriptor API.

עבור העברות USB (התקן למחשב), ההמרה מושבתת כברירת מחדל, אך המשתמשים יכולים לבחור להפעיל את ההמרה באמצעות הלחצן המרת סרטונים ל-AVC במסך הגדרת העדפות USB , כפי שמוצג באיור 3.

החלף כדי לאפשר המרת קידוד מדיה

איור 3. החלף כדי לאפשר המרת מדיה במסך העדפות USB.

הגבלות על בקשת קבצים מקודדים

כדי למנוע מבקשות המרת קידוד לנעול את משאבי המערכת לתקופות ממושכות, אפליקציות המבקשות הפעלות המרת קידוד מוגבלות ל:

  • 10 מפגשים רצופים
  • זמן ריצה כולל של שלוש דקות

אם אפליקציה חורגת מכל ההגבלות הללו, המסגרת מחזירה את מתאר הקובץ המקורי.

דרישות המכשיר

כדי לתמוך בתכונת המרת קידוד מדיה תואמת, התקנים חייבים לעמוד בדרישות הבאות:

  • למכשיר יש קידוד HEVC מופעל כברירת מחדל באפליקציית המצלמה המקורית
  • (מכשירים התומכים בקידוד HDR ל-SDR) המכשיר תומך בצילום וידאו HDR

כדי להבטיח את ביצועי ההתקן עבור המרת מדיה, יש לבצע אופטימיזציה של ביצועי גישת קריאה/כתיבה של חומרת וידאו ואחסון. כאשר רכיבי Codec מדיה מוגדרים בעדיפות שווה ל 1 , ה-Codec חייבים לפעול בתפוקה הגבוהה ביותר האפשרית. אנו ממליצים שביצועי ההמרה ישיגו מינימום של 200 פריימים לשנייה. כדי לבחון את ביצועי החומרה שלך, הפעל את רף ה-transcoder של המדיה ב- 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 הקשור להמרת מדיה תואמת.

קידוד HDR ל-SDR

כדי לתמוך בקידוד HDR ל-SDR, יצרני מכשירים יכולים להשתמש בתוסף הסינון לדוגמה של AOSP Codec 2.0 הממוקם ב- /platform/frameworks/av/media/codec2/hidl/plugin/ . סעיף זה מתאר כיצד פועל תוסף המסנן, כיצד ליישם את התוסף וכיצד לבדוק את הפלאגין.

אם מכשיר אינו כולל תוסף התומך בקידוד HDR ל-SDR, אפליקציה הנגישה לסרטון HDR תקבל את מתאר הקובץ המקורי ללא קשר ליכולות המדיה של האפליקציה המוצהרות במניפסט.

איך זה עובד

סעיף זה מתאר את ההתנהגות הכללית של תוסף הסינון Codec 2.0.

רקע כללי

אנדרואיד מספקת יישום שכבת התאמה בין ממשק Codec 2.0 לממשק android.hardware.media.c2 HAL ב- android::hardware::media::c2 . עבור תוספי סינון, AOSP כולל מנגנון עטיפה העוטף מפענחים יחד עם תוספי סינון. MediaCodec מזהה רכיבים עטופים אלה כמפענחים עם תכונות סינון.

סקירה כללית

מחלקת FilterWrapper לוקחת רכיבי קודקים של ספקים ומחזירה קודקים עטופים בחזרה לשכבת ההתאמה media.c2 . מחלקת FilterWrapper טוענת את libc2filterplugin.so דרך ה- FilterWrapper::Plugin API ומתעדת מסננים זמינים מהפלאגין. עם היצירה, 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. טיפול במאגר.

מאגרים העומדים בתור למפענח העטוף עוברים למפענח הבסיסי. הרכיב העטוף תופס את מאגר הפלט מהמפענח באמצעות התקשרות חוזרת onWorkDone_nb() ואז מעמיד אותו בתור למסננים. מאגר הפלט הסופי מהמסנן האחרון מדווח ללקוח.

כדי שהטיפול במאגר הזה יעבוד, הרכיב העטוף חייב להגדיר את C2PortBlockPoolsTuning למסנן האחרון כך שהמסגרת יציבה מאגר הבלוקים הצפוי.

עצור, אפס ושחרר

בעצירה, הרכיב העטוף עוצר את המפענח ואת כל המסננים המאופשרים שהופעלו. באיפוס ובשחרור, כל הרכיבים מתאפסים או משתחררים ללא קשר אם הם מופעלים או לא.

הטמע את הפלאגין של מסנן לדוגמה

כדי להפעיל את הפלאגין, בצע את הפעולות הבאות:

  1. הטמיע את ממשק FilterPlugin בספריה ושחרר אותו ב- /vendor/lib[64]/libc2filterplugin.so.
  2. הוסף הרשאות נוספות ל- mediacodec.te במידת הצורך.
  3. עדכן את שכבת ההתאמה לאנדרואיד 12 ובנה מחדש את שירות media.c2 .

בדוק את התוסף

כדי לבדוק את הפלאגין לדוגמה, בצע את הפעולות הבאות:

  1. בנה מחדש והבהב את המכשיר.
  2. בנו את הפלאגין לדוגמה באמצעות הפקודה הבאה:

    m sample-codec2-filter-plugin
    
  3. התקן מחדש את המכשיר ושנה את שם הפלאגין של הספק כך שהוא יזוהה על ידי שירות ה-codec.

    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