Kotlin

Iniciar la captura

startCapture() es el siguiente método que debemos implementar. Es llamado por el SDK cuando el editor comienza a capturar (por ejemplo, después de que Session.publish(publisher)). Debería iniciar su bucle de captura o escucha. Como verás los frames aquí, son entregados por ImageReader.setOnImageAvailableListenerAsí que startCapture() señalará principalmente que la captura está activa.

override fun startCapture(): Int {
    capturing = true
    return 0
}

Ciclo de vida:

  1. init() - Crear ImageReader e iniciar un hilo de fondo. En ImageReader proporciona una Surface que VirtualDisplay se convierte en.
  2. createVirtualDisplay() – Crear un VirtualDisplay con el respaldo de la ImageReader. El contenido de la pantalla se renderiza en esta pantalla.
  3. startCapture() - Se ejecuta cuando se inicia el editor. Marca la captura como activa.
  4. stopCapture() – Cierra la pantalla virtual, detén la proyección multimedia y recoge todo.

Introducción de marcos al SDK

Cuando el sistema representa un nuevo fotograma en el VirtualDisplay, ImageReader lo envía a través de onImageAvailable:

imageReader?.setOnImageAvailableListener(
    { reader ->
        val image = reader.acquireLatestImage()
        if (image != null) {
            val planes = image.planes
            provideBufferFrame(planes[0].buffer, ABGR, width, height, 0, false)
            image.close()
        }
    },
    backgroundHandler
)

El provideIntArrayFrame definido por el método BaseVideoCapturer envía una matriz entera de datos al editor, que se utilizará para el siguiente fotograma de vídeo publicado.

Si el editor sigue capturando vídeo, el ciclo vuelve a comenzar tras otro 1/15 de segundo, de modo que el capturador sigue proporcionando al editor nuevos fotogramas de vídeo para su publicación.