ב-Android מגרסה 12 (רמת API 31) ואילך, המערכת יכולה להמיר באופן אוטומטי סרטונים שהוקלטו בפורמטים כמו HEVC (H.265) ל-AVC (H.264) כשהסרטונים נפתחים באפליקציה שלא תומכת ב-HEVC. התכונה הזו מאפשרת לאפליקציות לצילום וידאו להשתמש בקידוד מודרני יותר וחסכוני יותר באחסון לסרטונים שצולמו במכשיר, בלי לפגוע בתאימות עם אפליקציות אחרות.
אפשר להמיר באופן אוטומטי את הפורמטים הבאים של תוכן שנוצר במכשיר:
| פורמט המדיה | מאפיין XML | סוג MIME של MediaFormat |
|---|---|---|
| HEVC (H.265) | HEVC | MediaFormat.MIMETYPE_VIDEO_HEVC |
| HDR10 | HDR10 | MediaFeature.HdrType.HDR10 |
| HDR10+ | HDR10Plus | MediaFeature.HdrType.HDR10_PLUS |
ב-Android, ההנחה היא שאפליקציות יכולות לתמוך בהפעלה של כל הפורמטים של המדיה, ולכן המרת קידוד למדיה תואמת מושבתת כברירת מחדל.
מתי כדאי להשתמש בהמרת קידוד
המרת קידוד היא פעולה שדורשת משאבי מחשוב רבים ומוסיפה עיכוב משמעותי בפתיחת קובץ וידאו. לדוגמה, בטלפון Pixel 3, המרת קובץ וידאו בפורמט HEVC באורך דקה לפורמט AVC נמשכת כ-20 שניות. לכן, כדאי להמיר קובץ וידאו רק כששולחים אותו מהמכשיר. לדוגמה, כשמשתפים קובץ וידאו עם משתמשים אחרים באותה אפליקציה, או עם שרת ענן שלא תומך בפורמטים מודרניים של וידאו.
אל תבצעו המרת קידוד כשאתם פותחים קובצי וידאו להפעלה במכשיר או ליצירת תמונות ממוזערות.
הגדרת המרת קידוד
אפליקציות יכולות לשלוט בהתנהגות של המרת הקידוד שלהן על ידי הצהרה על יכולות המדיה שלהן. יש שתי דרכים להצהיר על היכולות האלה: בקוד או במשאב.
הצהרה על יכולות בקוד
כדי להצהיר על יכולות מדיה בקוד, יוצרים מופע של אובייקט ApplicationMediaCapabilities באמצעות כלי ליצירת אובייקטים:
Kotlin
val mediaCapabilities = ApplicationMediaCapabilities.Builder() .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS) .build()
Java
ApplicationMediaCapabilities mediaCapabilities = new ApplicationMediaCapabilities.Builder() .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS) .build();
משתמשים באובייקט הזה כשניגשים לתוכן מדיה באמצעות שיטות כמו ContentResolver#openTypedAssetFileDescriptor():
Kotlin
val providerOptions = Bundle().apply { putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities) } contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions) .use { fileDescriptor -> // Content will be transcoded based on values defined in the // ApplicationMediaCapabilities provided. }
Java
Bundle providerOptions = new Bundle(); providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities); try (AssetFileDescriptor fileDescriptor = contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) { // Content will be transcoded based on values defined in the // ApplicationMediaCapabilities provided. }
השיטה הזו מאפשרת שליטה מפורטת בנתיבי קוד מסוימים, כמו הפעלת המרת קידוד רק כשמעבירים קובץ וידאו מהמכשיר. השיטה הזו מקבלת עדיפות על פני השיטה שמתוארת בהמשך.
הצהרה על יכולות במשאב
הצהרה על יכולות במשאב מאפשרת שליטה גורפת בהמרת קידוד. צריך להשתמש בשיטה הזו רק במקרים מאוד ספציפיים. לדוגמה, אם האפליקציה מקבלת קובצי וידאו רק מאפליקציות אחרות (במקום לפתוח אותם ישירות) ומעלה אותם לשרת שלא תומך בקודקים מודרניים של וידאו (ראו תרחיש לדוגמה 1 בהמשך).
שימוש בשיטה הזו כשאין בה צורך מוחלט עלול להפעיל המרת קידוד בתרחישים לא מכוונים, כמו יצירת תמונות ממוזערות של סרטונים, וכתוצאה מכך לפגוע בחוויית המשתמש.
כדי להשתמש בשיטה הזו, יוצרים קובץ משאבים של media_capabilities.xml:
<?xml version="1.0" encoding="utf-8"?>
<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
<format android:name="HEVC" supported="true"/>
<format android:name="HDR10" supported="false"/>
<format android:name="HDR10Plus" supported="false"/>
</media-capabilities>
בדוגמה הזו, סרטוני HDR שצולמו במכשיר עוברים המרה חלקה לסרטוני AVC SDR (טווח דינמי סטנדרטי), אבל סרטוני HEVC לא עוברים המרה.
משתמשים בתג property בתוך התג application כדי להוסיף הפניה לקובץ של יכולות המדיה. מוסיפים את המאפיינים האלה לקובץ AndroidManifest.xml:
<property
android:name="android.media.PROPERTY_MEDIA_CAPABILITIES"
android:resource="@xml/media_capabilities" />
שימוש ביכולות המדיה של אפליקציה אחרת כדי לפתוח קובץ וידאו
אם האפליקציה שלכם משתפת קובץ וידאו עם אפליקציה אחרת, יכול להיות שצריך להמיר את קובץ הווידאו לפני שהאפליקציה המקבלת תוכל לפתוח אותו.
כדי לטפל במקרה הזה, אפשר לפתוח קובץ וידאו באמצעות openTypedAssetFileDescriptor ולציין את מזהה המשתמש של האפליקציה המקבלת, שאפשר לקבל באמצעות Binder.getCallingUid.
לאחר מכן, הפלטפורמה משתמשת ביכולות המדיה של האפליקציה המקבלת כדי לקבוע אם צריך להמיר את קובץ הווידאו.
Kotlin
val providerOptions = Bundle().apply { putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, Binder.getCallingUid()) } contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions) .use { fileDescriptor -> // Content will be transcoded based on the media capabilities of the // calling app. }
Java
Bundle providerOptions = new Bundle(); providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, Binder.getCallingUid()); try (AssetFileDescriptor fileDescriptor = contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) { // Content will be transcoded based on the media capabilities of the // calling app. }
תרחישים לדוגמה
התרשימים הבאים ממחישים את שני תרחישי השימוש הנפוצים. בשני המקרים, הסרטון המקורי נשמר בפורמט HEVC והאפליקציה לשיתוף סרטונים לא תומכת ב-HEVC.
דוגמה 1 המרת הקידוד מתחילה באפליקציה לצילום סרטונים.
האפליקציה לשיתוף סרטונים מצהירה שהיא לא תומכת ב-HEVC בקובץ המשאבים של יכולות המדיה שלה. לאחר מכן, היא מבקשת סרטון מהאפליקציה לצילום וידאו. האפליקציה לצילום וידאו מטפלת בבקשה ופותחת את הקובץ באמצעות
openTypedAssetFileDescriptor, תוך ציון מזהה המשתמש של האפליקציה לשיתוף. הפעולה הזו מתחילה את תהליך המרת הקידוד.
כשהסרטון המומר מתקבל, הוא מועבר לאפליקציית השיתוף, שמעלה אותו לשרת בענן.
דוגמה 2. אפליקציית שיתוף הסרטונים מתחילה את תהליך המרת הקידוד.
אפליקציית צילום הסרטונים משתפת סרטון עם אפליקציית שיתוף הסרטונים באמצעות URI של
MediaStore. האפליקציה לשיתוף סרטונים פותחת את קובץ הווידאו באמצעות openTypedAssetFileDescriptor, ומציינת שהיא לא תומכת ב-HEVC ביכולות המדיה שלה. הפעולה הזו מתחילה את תהליך המרת הקידוד, וכשהוא מסתיים, הקובץ מועלה לשרת בענן.
פורמטים שלא הוצהרו
התכונה "המרת קידוד למדיה תואמת" מופעלת בכל הפורמטים שמוצהר שהם לא נתמכים, ומושבתת בכל הפורמטים שמוצהר שהם נתמכים. בפורמטים אחרים שלא הוצהרו, הפלטפורמה מחליטה אם לבצע המרת קידוד או לא. ב-Android 12, המרת קידוד מושבתת לכל הפורמטים שלא הוצהרו. יכול להיות שההתנהגות הזו תשתנה בפורמטים חדשים בעתיד.
אפשרויות למפתחים
אתם יכולים להשתמש באפשרויות הבאות למפתחים כדי לשנות את התנהגות ברירת המחדל של המרת קידוד ב-Android:
שינוי ברירות המחדל של המרת קידוד ההגדרה הזו קובעת אם הפלטפורמה שולטת בהמרת הקידוד האוטומטית. כשההגדרה הזו מופעלת, המערכת מתעלמת מהגדרות ברירת המחדל של הפלטפורמה, וההגדרה הפעלת המרת קידוד קובעת אם תתבצע המרת קידוד אוטומטית. האפשרות הזו מושבתת כברירת מחדל.
הפעלת המרת קידוד ההגדרה הזו קובעת אם פורמטים לא מוצהרים עוברים המרת קידוד באופן אוטומטי. היא מופעלת כברירת מחדל, אבל משפיעה רק אם גם המדיניות שינוי ברירות המחדל של המרת קידוד מופעלת.
הנחה שהאפליקציות תומכות בפורמטים מודרניים ההגדרה הזו קובעת מה קורה כשהאפליקציה מנסה להפעיל פורמט לא מוצהר. זה קורה כשהמניפסט לא מצהיר אם האפליקציה תומכת בפורמט מסוים, או כש-Google לא הוסיפה את האפליקציה לרשימת ההמרה הכפויה בצד השרת. כשההגדרה מופעלת, האפליקציה לא מבצעת המרת קידוד. כשההגדרה מושבתת, האפליקציה מבצעת המרת קידוד. האפשרות הזו מופעלת כברירת מחדל.
הצגת התראות על המרת קידוד כשהאפשרות הזו מופעלת, האפליקציה מציגה התראה על התקדמות המרת הקידוד כשהמרת הקידוד מופעלת על ידי קריאה של קובץ מדיה לא נתמך. האפשרות הזו מופעלת כברירת מחדל.
השבתת המטמון של המרת קידוד אם ההגדרה מופעלת, אפליקציות שדורשות המרת קידוד לא משתמשות במטמון של המרת הקידוד. האפשרות הזו יכולה לעזור במהלך הפיתוח כדי להפעיל בקלות המרת קידוד בקובץ מדיה שלא נתמך, אבל היא עלולה לגרום לביצועים נמוכים של המכשיר. האפשרות הזו מושבתת כברירת מחדל.