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:
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:
getOutputSize(List<Size> inputSizes), que pode ser usado para especificar o tamanho de cadaEditedMediaItemSequencede entrada.getOverlaySettings(int inputId, long presentationTimeUs), em que é possível especificar como cada sequência deve aparecer no frame.
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.