הגדרת קומפוזיציה של פריטי מדיה

ספריית Media3 Transformer מספקת חבילת כלים לעריכה ולמניפולציה של מדיה. רכיב מרכזי לעריכה של כמה נכסים הוא ממשק ה-API‏ Composition. ה-API הזה מאפשר לסדר כמה פריטי מדיה להזנה, כמו קליפים של סרטונים, תמונות וטראקים של אודיו, במבנה קוהרנטי אחד שאפשר לעבד, להציג בתצוגה מקדימה או לייצא. אפשר לחשוב על Composition כעל ציר זמן שמכיל רצף אחד או יותר של מדיה. כל רצף (מוגדר על ידי EditedMediaItemSequence) מכיל פריטי מדיה נפרדים (מוגדרים כמופעים של EditedMediaItem). אפשר להחיל טרנספורמציות ואפקטים על EditedMediaItem בודד או על Composition שלם.

המבנה של אובייקט Composition
המבנה של אובייקט 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.