تحديد التنسيقات باستخدام VideoCompositorSettings مخصّص

قد يريد المستخدمون تعديل عدة مواد عرض وسائط معًا بحيث يظهر أكثر من عنصر وسائط واحد في الوقت نفسه في الفيديو النهائي. ويشمل ذلك ترتيب العناصر في تخطيطات، مثل نافذة ضمن نافذة أو جنبًا إلى جنب أو شبكة. في ما يلي بعض الأمثلة على هذه المشاريع:

فيديو بتنسيق "نافذة ضمن النافذة"
ملفات وسائط مرتّبة في تخطيط صورة داخل صورة
فيديو بتنسيق العرض على شكل مربّعات
ملفات الوسائط مرتّبة في تخطيط شبكي 2x2

يمكنك استكشاف تنفيذ لهذه التصاميم في تطبيق العرض التوضيحي لـ Composition.

تنفيذ VideoCompositorSettings

تحتوي الواجهة VideoCompositorSettings على طريقتَين:

ضبط طريقة عرض تسلسل باستخدام OverlaySettings

يجب أن يعرض تنفيذ getOverlaySettings() مثيلاً لواجهة OverlaySettings لكل تسلسل في مشروعك. تحدّد المَعلمة inputId التسلسل الذي سيتم تطبيق الإعدادات عليه. لإنشاء مثيل، يمكنك استخدام فئة StaticOverlaySettings المضمّنة في Media3. راجِع صفحة StaticOverlaySettings.Builder المرجعية للاطّلاع على القائمة الكاملة لخيارات الإعداد، والتي تتضمّن تعديلات مرئية مثل الشفافية الأبجدية وسطوع النطاق الديناميكي العالي، وتعديلات موضعية مثل نقطة الارتكاز والموقع داخل الإطار، وعمليات تحويل مثل التدوير والتوسيع.

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()
  }
}

الملاحظات

إذا كانت لديك أي ملاحظات أو طلبات ميزات لحالات استخدام تركيب الفيديو، يمكنك الإبلاغ عن مشكلة في مستودع Media3 على GitHub.