ספריית Media3 Transformer מספקת חבילת כלים לעריכה ולמניפולציה של מדיה. רכיב מרכזי לעריכה של כמה נכסים הוא ממשק ה-API Composition. ה-API הזה מאפשר לסדר כמה פריטי מדיה להזנה, כמו קליפים של סרטונים, תמונות וטראקים של אודיו, במבנה קוהרנטי אחד שאפשר לעבד, להציג בתצוגה מקדימה או לייצא. אפשר לחשוב על Composition כעל ציר זמן שמכיל רצף אחד או יותר של מדיה. כל רצף (מוגדר על ידי EditedMediaItemSequence) מכיל פריטי מדיה נפרדים (מוגדרים כמופעים של EditedMediaItem).
אפשר להחיל טרנספורמציות ואפקטים על EditedMediaItem בודד או על Composition שלם.
Composition הוא נקודת הכניסה שלכם למגוון תרחישי שימוש ב-Media3
Transformer, כמו:
- שילוב רציף של נכסי אודיו, תמונות ווידאו.
- הוספת סרטון על גבי סרטון אחר (תמונה בתוך תמונה).
- מיקס של טראק אודיו שמתנגן ברקע עם רצף של סרטונים.
- הוספת אפקטים חזותיים או קוליים לכל הקטע הערוך.
- טיפול בתרחישים מורכבים כמו עיבוד של סרטוני HDR.
המדריך הזה מתמקד בהגדרות ובבנייה של אובייקטים מסוג Composition, כולל הסבר על המחלקות העיקריות שמשתתפות בתהליך, איך ליצור קומפוזיציות בסיסיות ומורכבות יותר עם רצפים בודדים או מרובים, ואיך להחיל אפקטים ברמות שונות.
מושגים וסוגים מרכזיים
כדי להשתמש ביעילות ב-Composition API, חשוב להבין את המחלקות העיקריות שמשתתפות ביצירת קומפוזיציה של מדיה:
Effects:
- מטרה: אובייקט
Effectsהוא אוסף של מעבדי אודיו ואפקטים של וידאו. - איך משתמשים בזה: בהקשר של
Composition, אפשר להגדירEffectsבמקרים ספציפיים שלEditedMediaItemכדי לשנות קליפים מסוימים, או בCompositionכולו (בדרך כלל לאפקטים שלPresentationשמשפיעים על הפלט הסופי, כמו התאמה של רזולוציית התצוגה או קצב הפריימים). - למה זה חשוב:
Effectsהוא המנגנון להחלת טרנספורמציות, מסננים ועיבודים אחרים על המדיה, ברמת הפריט הבודד וברמת הקומפוזיציה הכוללת. מידע נוסף זמין במאמרTransformations.
EditedMediaItem:
- מטרה: המחלקה הזו מייצגת פריט מדיה יחיד (כמו סרטון, תמונה או קובץ אודיו) ואת העריכות שצריך להחיל עליו.
- איך משתמשים בו:
EditedMediaItemמקבץMediaItem(שמפנה לתוכן המדיה בפועל) עם אובייקטEffects. - למה זה חשוב: זהו אבן הבניין הבסיסית של הקומפוזיציה. כך תוכלו להגדיר בדיוק אילו קטעי מדיה לכלול ואיך כל קטע צריך להיראות ולהישמע לפני שהוא משולב עם קטעים אחרים ברצף.
EditedMediaItemSequence:
- מטרה: מייצג רצף לינארי של אובייקטים מסוג
EditedMediaItemשמיועדים להפעלה אחד אחרי השני. - אופן השימוש:
EditedMediaItemSequenceנוצר עם רשימה של אובייקטים מסוגEditedMediaItem. כל רצף בתוךCompositionדומה לטראק או לשכבה בציר זמן של עריכת סרטונים עם כמה טראקים. לדוגמה, רצף אחד יכול להכיל את קליפי הווידאו העיקריים, רצף אחר, שחופף לו בזמן, יכול להכיל קליפים של וידאו שיוצגו כשכבת-על על הראשון, ורצף נוסף יכול להכיל רק טראק אודיו למוזיקת רקע. - למה זה חשוב:
EditedMediaItemSequenceקבוצות של פריטי מדיה קשורים שצריכים להופיע אחד אחרי השני. שימוש בכמה רצפים מאפשר ליצור סידורים מורכבים יותר, כמו הוספת שכבות של אודיו או יצירת שכבות-על חזותיות.
Composition:
- מטרה: זהו האובייקט ברמה העליונה שמייצג את ציר הזמן המלא של המדיה שצריך לעבד. הוא משמש כמאגר לכל רצפי המדיה ולכל ההגדרות או האפקטים הגלובליים שחלים על הפלט כולו.
- אופן השימוש:
Compositionמורכב מאובייקטEditedMediaItemSequenceאחד או יותר. אפשר גם להחיל אפקטים על כל הקומפוזיציה ולהגדיר הגדרות גלובליות כמו מצב HDR ישירות בComposition. אם רכיבCompositionמכיל כמה אובייקטים מסוגEditedMediaItemSequence, אפשר לסדר את הרצפים האלה כך שיוצגו ברצף או בחפיפה בזמן, וכך ליצור פריסות של שכבות-על כמו תמונה בתוך תמונה או מעברים מרצף אחד לרצף אחר. - למה זה חשוב:
Compositionמגדיר את המבנה הכללי של מדיה הקלט שצריך לעבד, והוא אובייקט נפוץ שאפשר להשתמש בו גם כדי לצפות בתצוגה מקדימה של עריכות באמצעותCompositionPlayerוגם כדי לייצא סרטון פלט עם עריכות שהוחלו באמצעותTransformer.
יצירה וייצוא של Composition
הנה דוגמה ליצירת נכס וידאו שמורכב משני קטעי וידאו ערוכים, עם טראק אודיו שמוצג מעליהם, וייצוא שלו:
Kotlin
val video1 = EditedMediaItem.Builder(MediaItem.fromUri(video1Uri)).build() val video2 = EditedMediaItem.Builder(MediaItem.fromUri(video2Uri)).build() val videoSequence = EditedMediaItemSequence.withAudioAndVideoFrom(listOf(video1, video2)) val backgroundAudio = EditedMediaItem.Builder(MediaItem.fromUri(audioUri)).build() val backgroundAudioSequence = EditedMediaItemSequence.withAudioFrom(listOf(backgroundAudio)) .buildUpon() .setIsLooping(true) // Loop audio track through duration of videoSequence .build() val composition = Composition.Builder(videoSequence, backgroundAudioSequence).build() transformer.start(composition, filePath)
Java
EditedMediaItem video1 = new EditedMediaItem.Builder(MediaItem.fromUri(video1Uri)).build(); EditedMediaItem video2 = new EditedMediaItem.Builder(MediaItem.fromUri(video2Uri)).build(); EditedMediaItemSequence videoSequence = EditedMediaItemSequence.withAudioAndVideoFrom(ImmutableList.of(video1, video2)); EditedMediaItem backgroundAudio = new EditedMediaItem.Builder(MediaItem.fromUri(audioUri)).build(); EditedMediaItemSequence backgroundAudioSequence = EditedMediaItemSequence.withAudioFrom(ImmutableList.of(backgroundAudio)) .buildUpon() .setIsLooping(true) // Loop audio track through duration of videoSequence .build(); Composition composition = new Composition.Builder(videoSequence, backgroundAudioSequence).build(); transformer.start(composition, filePath);
דוגמאות לתרחישי שימוש נתמכים
זו רשימה לא ממצה של תרחישי שימוש שנתמכים על ידי Transformer API עם Composition:
- שילוב רציף של נכסי אודיו, תמונות ווידאו.
- הוספת אודיו לרקע של נכס וידאו.
- הוספת אפקטים ליצירה.
- מיפוי טונים של קלט HDR ל-SDR כדי ליצור פלט SDR באיכות חזותית טובה יותר.
מגבלות נוכחיות
רצפים בתוך קומפוזיציה צריכים לעמוד בתנאים שמפורטים בקטע Transformer.start().
בנוסף, הפעולות הבאות עדיין לא נתמכות כשעובדים עם יצירות מוזיקליות:
- הוספת מעבר הדרגתי בין רצועות וידאו או אודיו
בקשות להוספת תכונות
אם יש לכם בקשות לתכונות ב-Transformer APIs, אתם יכולים לפתוח בעיה במאגר Media3 ב-GitHub.