אנשים רבים משתפים סרטונים באמצעות מכשירי Android שלהם. האיכות של התוצאות שהתקבלו לעיתים קרובות הסרטון נחות יותר מהמקור בגלל עיבוד באמצעות אפליקציית השיתוף. במסמך הזה נסביר איך לשפר את האיכות של בסרטונים המשותפים וכמה מלכודות נפוצות בעיבוד וידאו שכדאי להימנע מהן. כדי לבצע אופטימיזציה לשיתוף תוכן של סרטונים באיכות HDR: בדף הזה משתמשים במודול Transformer כדי להמיר קידוד HDR ל-SDR.
הדבר העיקרי הוא לשמור על רזולוציה קבועה ולשמור על איכות הווידאו זמן רב ככל האפשר בזמן ההכנות לשיתוף סרטון.
צינור עיבוד הנתונים לשיתוף
איור 1 ממחיש את התהליך האופייני לשיתוף סרטון:
צינור עיבוד הנתונים כולל את השלבים הבאים:
- צלמו וקודדו סרטון, ואולי גם יוסיפו אפקטים במהלך הצילום. לחלופין, המשתמשים יכולים לדלג על השלב הזה ולבחור סרטון מהאחסון שהוקלט מראש מאפליקציה אחרת.
- לערוך את הסרטון, לסנן אותו, לשפר אותו או לעבד אותו בדרך אחרת.
- לשנות את הגודל או את הגודל של הסרטון כהכנה להמרת הקידוד.
- המרת הקידוד של הסרטון לצורך שיתוף. הסינון בשלב 2 ניתן בדרך כלל באופן הבא: חלק מהשלב הזה.
צינור עיבוד הנתונים כולל שני שלבים שבהם יש לכם הזדמנות להגדיר פרמטרים שקובעים את איכות הווידאו של הסרטון: הקידוד במהלך הקלטה והמרת קידוד לפני השיתוף. בנוסף, ייתכן שתצטרכו להתאים את קנה המידה של הסרטון לפני שלב המרת הקידוד האחרון, דבר שעלול להשפיע גם על האיכות.
המלצות
טבלה 1 מציגה את חמשת הפרמטרים העיקריים לאיכות הווידאו, מציין באילו שלבים ניתן להשתמש.
פרמטר | צילום | שיתוף |
פרופיל | Y | Y |
רזולוציה | Y | Y |
קצב העברת נתונים | Y | Y |
פרמטר כמות (QP) | (לעיתים נדירות) | Y |
B פריימים | לא | Y |
פרופיל
לקבלת תוצאות טובות יותר, כדאי להשתמש בפרופילים המתקדמים יותר שמסופקים על ידי את הקודק. לקידוד AVC, בוחרים באפשרות 'פרופיל גבוה' ו'רמה 4'.
רזולוציה, חיתוך והתאמה לעומס (scaling)
ניתן לשנות את הרזולוציה הראשונית של הסרטון שצולם בשלב ההגדלה לפני המרת הקידוד לשיתוף, אבל התאמה לעומס עלולה לפגוע באיכות וידאו. אנחנו ממליצים להימנע משינוי גורף ולבחור רזולוציה שבו ניתן להשתמש בכל צינור עיבוד הנתונים. חשוב גם לזכור שמודל קיצוני תוצאות החיתוך של תמונה באיכות נמוכה, במיוחד אם מגדילים את החלק החתוך תמונה. חשוב להקפיד על ההנחיות הבאות:
- צריך לבחור רזולוציה גדולה לפחות כמו רזולוציית השיתוף הסופית.
רזולוציית הצילום לא יכולה לחרוג מאוד מרזולוציית השיתוף אלא אם כל שלבי הביניים נועדו לתמוך (למשל, קצב העברת נתונים גבוה יותר במהלך הצילום הראשוני).
- אם קידוד השיתוף מניב רזולוציה של 720x1280, מומלץ רזולוציית צילום של 720x1280.
- אם שלבי הביניים בין צילום לשיתוף כוללים חיתוך, השתמשו רזולוציית צילום גבוהה יותר כגון 1080x1920, ותגדיל את קצב העברת הנתונים של הצילום כדי לטפל בפיקסלים הנוספים.
חיתוך קיצוני יגרום לתמונה באיכות נמוכה, במיוחד אם היא חתוכה התמונה הוגדלה.
מומלץ להימנע משיפור הרזולוציה מרזולוציה נמוכה לרזולוציה גבוהה יותר. ניסיונות לשיפור קנה המידה כדי ליצור פרטים שלא קיימים. בוחרים ברזולוציה הגבוהה יותר הרצויה מההתחלה.
אם אתם חייבים להגדיל, משנים את פרמטרים של הקידוד. לדוגמה, אם ברזולוציה המשופרת יש פי שניים פיקסלים, וקצב העברת הנתונים כפול.
רזולוציה וקצב העברת נתונים קשורים זה לזה. לדוגמה, שימוש ברזולוציה גבוהה סרטון באמצעות צינור שיתוף, שבסוף ממיר את הקידוד לקצב העברת נתונים נמוך יוצרת תמונה באיכות נמוכה יותר מאשר תמונות ברזולוציה נמוכה יותר. כי קצב העברת הנתונים יורד, יש נקודות הצלבה שבהן מתחילות רזולוציות קטנות יותר כדי שיניבו תוצאות טובות יותר:
קצב העברת נתונים | רזולוציה |
5Mbps ומעלה | 1,080 x 1,920 |
1.5–5Mbps | 720x1280 |
1.5Mbps לכל היותר | שווה ערך ל-SD. אותה מספר פיקסלים ביחס גובה-רוחב של 9:16 היא בערך 416x736 |
אפליקציות פופולריות רבות משתפות סרטונים ברזולוציה של 720p ומטה. הנתונים מציינים שרזולוציה של 720p מתאימה ליעדי קצב העברת נתונים בין 1.5 ו- 5Mbps.
קצב העברת נתונים
מתבצעת הקלטה
שימוש בקצב העברת נתונים גבוה יותר בקידוד מספק את השיפור המשמעותי ביותר בווידאו באיכות גבוהה. אנחנו ממליצים לבחור קצבי העברת נתונים שמתאימים לאפליקציות המצלמה המקוריות. עבור רזולוציה של 720x1280, אנחנו ממליצים על קצב העברת נתונים של 10Mbps לצילום.
מכיוון שקידוד הצילום מתבצע במכשיר, אפשר להשתמש בקצב העברת נתונים גבוה יותר כדי מפצות על רוב הטרנספורמציות של שלבי השיתוף באמצעות ההשפעה. הקבצים הגדולים יותר שנוצרו משמשים רק לביצוע מניפולציות במכשיר.
ניתן להפחית את קצב העברת הנתונים בשלב המרת הקידוד האחרון, כפי שמוצג בטבלה 2.
שיתוף
לקצב העברת הנתונים יש את ההשפעה הגדולה ביותר בזמן השיתוף, מפני שהוא קשור ישירות גודל הסרטון שיועלה. יש יחסי גומלין בין הסרטונים האיכות, זמן העברת הקבצים ועלויות האחסון בענן.
גם הבחירה בפרופיל הקידוד, בפריימים B-פריימים ובערכים התוחמים ב-QP גבוהה יותר חשובה בשלב הזה מאשר במהלך הצילום.
אנחנו ממליצים על קצב העברת נתונים של 4-5Mbps (לרזולוציה של 720x1280) כדי להבטיח איכות טובה האיכות החזותית שלו.
פרמטר כמות (QP)
ב-Android מגרסה 12 ואילך, מפתחות ה-QP הם סטנדרטיים וזמינים
MediaFormat
וב-
ספריית המדיה של NDK.
בגרסאות קודמות של Android, מניפולציית QP זמינה רק באמצעות framework
פועלות באמצעות מפתחות ספציפיים לספק בהגדרות של MediaFormat
.
מתבצעת הקלטה
במהלך צילום הסרטון, כדאי להשתמש בבקרת קצב העברת הנתונים ולא בהגדרות ה-QP. לא תמיד זמין.
לא מומלץ לשנות את הגדרות ה-QP כדי לתעד קצב העברת נתונים של 10Mbps (לגודל 720x1280). אם קצב העברת הנתונים של הצילום נמוך באופן משמעותי, פחות מ- 5Mbps 720x1280, הגדרת QP של 40 היא התפשרות טובה בין איכות גבוהה יותר מבלי לאלץ את הקודק לבצע חריגה מקצב העברת הנתונים של היעד לעתים קרובות מדי.
שיתוף
אנחנו ממליצים על מגבלת QP מקסימלית של 40, במיוחד כשקצב העברת הנתונים נמוך מ- 4 Mbps. פעולה זו מבטיחה איכות מינימלית לסרטונים המקודדים, אך יכולה להפיק התוצאה תהיה קצב העברת נתונים גבוה יותר. העלייה בקצב העברת הנתונים תלויה את המורכבות של הסרטון. למרות שאפליקציית שיתוף עשויה להתמודד עם שונות מסוימת של הסרטון שנוצר, ייתכן שהוא לא יעמדו בקצב של עלייה מעבר סף מסוים.
ניתן להגביל את ההגדלה של קצב העברת הנתונים על ידי קידוד מחדש של הסרטון לשיתוף עם מגבלת QP מקסימלית פחות מגבילה (גבוהה). כך לקודק יש יותר חופש לוותר על האיכות ולשמר חלקים אחרים של הסרטון. אפשר לקודד מחדש את סרטון לשיתוף מפני שזו פעולת המרת קידוד; כבר יש לך צולם את הסרטון שאתם מתכוונים לשתף.
החיסרון הוא שחוזרים על שלב המרת הקידוד עם הערכים פרמטרים מאריכים את הזמן שנדרש לשיתוף הסרטון. אחת הדרכים להפחית בזמן האחזור הוא לבחון את הסרטון שעבר המרת קידוד חלקית, כדי להחליט אם הוא לא בטווח הסבלנות שלך לחריגת קצב העברת נתונים. אם לא, אפשר להפסיק להמיר את הקידוד ולנסות שוב עם פרמטרים מתאימים יותר של QP.
פריימים מסוג B-frame ופרופילי קידוד
מומלץ להשתמש בפריים B רק במהלך השיתוף ורק בזמן ההפעלה Android מגרסה 10 ואילך.
על האפליקציות לבדוק את פרופילי הקידוד הנתמכים באמצעות
CodecCapabilities
מכיוון שלא כל המכשירים תומכים בפרופיל הראשי או בפרופיל הגבוה. שימוש בפרופיל הגבוה ביותר
נתמך על ידי מקודד ה-AVC: גבוה > ראשי > ערך הבסיס. כדי לקבל את התוצאות הבטוחות ביותר,
הגדרת פריימים מסוג B
(KEY_LATENCY
או
KEY_MAX_B_FRAMES
)
כשמשתמשים בהגדרה הבסיסית
מכיוון שחלק מהמקודדים עלולים להיכשל.
בקטעי הקוד הבאים מניחים את הערך 'MediaFormat format'
שישמש כדי
להגדיר את מקודד ה-AVC
10 Android
API מגרסה 29 ואילך
משתמשים בפרופיל הנתמך ביותר ומגדירים את הערך 1 בפרמטר B-frame:
format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_MAX_B_FRAMES, 1);
אין להגדיר את KEY_LATENCY
במצב הזה.
Android בגרסאות 8, 8.1 ו-9
ממשקי API 26, 27, 28
שימוש בפרופיל עם התמיכה הגבוהה ביותר, אבל השבתה של היצירה של פריימים מסוג B. הזה
כוללת מגבלות מסוימות
MediaMuxer
בגרסאות המערכת האלה
format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_LATENCY, 1);
הערך KEY_LATENCY
אוסר על רכיבי הקודק ליצור פריימים מסוג B, אבל עדיין
מנצלת יכולות אחרות של קודק.
אם באפליקציה לא נעשה שימוש ב-MediaMuxer
להרכבת קובץ הפלט הסופי, אפשר
כדי להפעיל פריימים מסוג B-frame, מגדירים את הערך של KEY_LATENCY
כ-2 במקום 1. הפעולה הזו
מאפשרות לקודק ליצור פריימים מסוג B-frames.
Android 7.1 וגרסאות קודמות
API 25 ודגמים קודמים
כדאי להשתמש בפרופיל הבסיסי כדי לקבל את התוצאות הבטוחות ביותר.
format.setInt32(KEY_PROFILE, AVCProfileBaseline);
לפני גרסה 7, מערכת Android AOSP תומכת רק בפרופיל הבסיסי. עם זאת, סביר להניח שיצרני ציוד מקורי הפעילו פרופיל ראשי/גבוה במכשירים מסוימים, למשל באמצעות פרופיל ספציפי לספק.
אם באפליקציה לא נעשה שימוש בMediaMuxer
, אפשר להשתמש בפרופיל הראשי או בפרופיל הגבוה כאשר
שהקודק תומך בו. אין מפתח פורמט ציבורי לשליטה במספר B-
פריימים.
שימוש במודול הטרנספורמר כדי להמיר קידוד HDR ל-SDR
החל מ-Android 13 (רמת API 33), מומלץ להשתמש ב-Jetpack Media3 טרנספורמר מודול לשיתוף תוכן HDR עם אפליקציות, שירותים ומכשירים שלא תומכים ב-HDR. המודול של הטרנספורמר פועל על ידי מיפוי גוונים קלט וידאו HDR באיכות SDR ושמירת התוצאה כקובץ MP4, מה שמאפשר הפעלה מוצלחת ללא אובדן הפרטים או בהירות התמונה.
הערה: במכשירים שמטרגטים גרסאות מערכת בין Android 12 (רמת API 32) עד ל-Android 7.0 (רמת API 24), המודול של הטרנספורמר פועל בצורה שונה. אם המיקום המכשיר תומך ב-HDR, והאפליקציה מפעילה את התוכן ללא מיפוי גוונים. אם המכשיר לא תומך ב-HDR, תופיע הודעת שגיאה שמציינת ש-HDR אין תמיכה במיפוי טונים.
הקוד הבא מגדיר טרנספורמר שממפה את הקלט ל-SDR מקודד מחדש בפורמט הקלט (למשל H.264/AVC):
Kotlin
val transformer = Transformer.Builder(context) .setTransformationRequest( TransformationRequest.Builder() .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR) .build()) .addListener(/* ... */) .build()
Java
Transformer transformer = new Transformer.Builder(context) .setTransformationRequest( new TransformationRequest.Builder() .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR) .build()) .addListener(/* ... */) .build();
כדי לנסות את הפונקציונליות של מיפוי טונים, אפשר אפליקציית ההדגמה של Transformer.
אפשר גם להגדיר מיפוי טונים באמצעות
MediaCodec
, למרות שההטמעה
הוא מורכב יותר. מידע נוסף זמין במאמר
MediaCodec
מאמרי עזרה.