Gli utenti potrebbero voler modificare più asset multimediali contemporaneamente in modo che più elementi multimediali vengano visualizzati contemporaneamente nel video finale. Ciò include la disposizione degli elementi in layout come picture-in-picture, side-by-side o una griglia. Ecco alcuni esempi di questi progetti:
Puoi esplorare un'implementazione di questi layout nell' app demo Composition.
Implementare un VideoCompositorSettings
L'interfaccia VideoCompositorSettings contiene due metodi:
getOutputSize(List<Size> inputSizes), che puoi utilizzare per specificare le dimensioni di ogni inputEditedMediaItemSequencegetOverlaySettings(int inputId, long presentationTimeUs), in cui puoi specificare come deve essere visualizzata ogni sequenza nel frame
Configurare la presentazione di una sequenza con un OverlaySettings
L'implementazione di getOverlaySettings() deve restituire un'istanza dell'
OverlaySettings interfaccia per ogni sequenza nel progetto. Il parametro inputId identifica la sequenza a cui verranno applicate le impostazioni.
Per creare un'istanza, puoi utilizzare la StaticOverlaySettings classe
inclusa in Media3. Consulta la pagina di riferimento StaticOverlaySettings.Builder per un elenco completo delle opzioni di configurazione, che include modifiche visive come la trasparenza alfa e la luminanza HDR, modifiche posizionali come il punto di ancoraggio e la posizione all'interno del frame e trasformazioni come la rotazione e la scalabilità.
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() } }
Utilizzando il parametro presentationTimeUs del metodo getOverlaySettings(), puoi modificare queste impostazioni in base alla posizione del video, come illustrato nell'esempio di picture-in-picture in movimento riportato in precedenza in questa pagina.
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 hai feedback o richieste di funzionalità per i casi d'uso di composizione video, segnala un problema nel repository GitHub di Media3.