הגדרת פריסות באמצעות VideoCompositorSettings בהתאמה אישית

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

סרטון עם פריסת תמונה בתוך תמונה
פריטי מדיה מסודרים בפריסת תמונה בתוך תמונה.
סרטון עם פריסת רשת
קובצי מדיה מסודרים בפריסת משבצות של 2x2.

אפשר לראות איך ליישם את הפריסות האלה באפליקציית ההדגמה של Composition.

הטמעה של VideoCompositorSettings

הממשק של VideoCompositorSettings מכיל 2 שיטות:

הגדרת הצגה של רצף באמצעות OverlaySettings

ההטמעה של getOverlaySettings() צריכה להחזיר מופע של הממשק OverlaySettings לכל רצף בפרויקט. הפרמטר inputId מזהה את הרצף שאליו יחולו ההגדרות. כדי ליצור מכונה, אפשר להשתמש במחלקה StaticOverlaySettings שכלולה ב-Media3. בדף ההפניה StaticOverlaySettings.Builder מופיעה רשימה מלאה של אפשרויות ההגדרה, כולל שינויים חזותיים כמו שקיפות אלפא ובהירות HDR, שינויים במיקום כמו נקודת עיגון ומיקום בתוך המסגרת, ושינויים כמו סיבוב ושינוי גודל.

override fun getOverlaySettings(inputId: Int, presentationTimeUs: Long): OverlaySettings {
  return when (inputId) {
    // Position the first sequence in the top-left
    0 -> {
      StaticOverlaySettings.Builder()
        // Scale the video down to 1/4th the size of the frame
        .setScale(0.5f, 0.5f)
        // Anchor the sequence in the middle of frame
        .setOverlayFrameAnchor(0f, 0f)
        // Position the video in the top-left section of the frame
        .setBackgroundFrameAnchor(-0.5f, 0.5f)
        .build()
    }
    // Add more cases for remaining input sequences
    else -> StaticOverlaySettings.Builder().build()
  }
}

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

override fun getOverlaySettings(inputId: Int, presentationTimeUs: Long): OverlaySettings {
  return if (inputId == 0) {
    // Use the first sequence as the overlay
    val cycleRadians = 2 * PI * (presentationTimeUs.toDouble() / cycleTimeUs)
    StaticOverlaySettings.Builder()
      // Scale the overlay down
      .setScale(0.35f, 0.35f)
      // Anchor the overlay in the top-middle of the frame
      .setOverlayFrameAnchor(0f, 1f)
      // Move the overlay over time
      .setBackgroundFrameAnchor(sin(cycleRadians).toFloat() * 0.5f, -0.2f)
      // Rotate the overlay over time
      .setRotationDegrees(cos(cycleRadians).toFloat() * -10f)
      .build()
  } else {
    // Present the second sequence in the background as normal
    StaticOverlaySettings.Builder().build()
  }
}

משוב

אם יש לכם משוב או בקשות לתכונות שקשורות לתרחישי שימוש בהרכבת סרטונים, אתם יכולים לפתוח issue במאגר Media3 ב-GitHub.