Definir layouts com um VideoCompositorSettings personalizado

Os usuários podem querer editar vários recursos de mídia juntos para que mais de um item de mídia apareça ao mesmo tempo no vídeo final. Isso inclui organizar itens em layouts como picture-in-picture, lado a lado ou uma grade. Confira alguns exemplos:

Vídeo com layout picture-in-picture
Itens de mídia organizados em um layout picture-in-picture.
Vídeo com layout de grade
Itens de mídia organizados em um layout de grade 2x2.

Confira uma implementação desses layouts no app de demonstração de composição.

Implementar um VideoCompositorSettings

A interface VideoCompositorSettings contém dois métodos:

Configurar a apresentação de uma sequência com um OverlaySettings

Sua implementação de getOverlaySettings() precisa retornar uma instância da interface OverlaySettings para cada sequência no seu projeto. O parâmetro inputId identifica a qual sequência as configurações serão aplicadas. Para criar uma instância, use a classe StaticOverlaySettings incluída na Media3. Consulte a página de referência StaticOverlaySettings.Builder para ver uma lista completa de opções de configuração, que inclui modificações visuais, como transparência alfa e luminância HDR, modificações posicionais, como ponto de ancoragem e localização no frame, e transformações, como rotação e escala.

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

Usando o parâmetro presentationTimeUs do método getOverlaySettings(), é possível modificar essas configurações com base na posição do vídeo, como demonstrado no exemplo de picture-in-picture em movimento nesta página.

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

Feedback

Se você tiver feedback ou solicitações de recursos para casos de uso de composição de vídeo, registre um problema no repositório do Media3 no GitHub.