Kotlin

Iniciando a captura

startCapture() é o próximo método que precisamos implementar. Ele é chamado pelo SDK quando o editor inicia a captura (por exemplo, após Session.publish(publisher)). Isso deve iniciar seu ciclo de captura ou ouvinte. Como você verá, os quadros aqui são fornecidos por ImageReader.setOnImageAvailableListener, então startCapture() servirá principalmente para indicar que a captura está ativa.

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

Ciclo de vida:

  1. init() – Criar ImageReader e iniciar uma thread em segundo plano. A ImageReader oferece um Surface que VirtualDisplay se transforma em.
  2. createVirtualDisplay() – Criar um VirtualDisplay com o apoio do ImageReaderda superfície. O conteúdo da tela é exibido nesse visor.
  3. startCapture() – Chamado quando o publisher é iniciado. Marca a captura como ativa.
  4. stopCapture() – Desligue a tela virtual, interrompa a projeção de mídia e faça a limpeza.

Inserindo Frames no SDK

Quando o sistema renderiza um novo quadro na VirtualDisplay, ImageReader envia por meio 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
)

O provideIntArrayFrame método, definido pelo BaseVideoCapturer classe, envia uma matriz de inteiros com dados ao editor, para serem usados no próximo quadro de vídeo publicado.

Se o editor ainda estiver capturando vídeo, o ciclo recomeça após mais 1/15 de segundo, de modo que o capturador continue a fornecer ao editor novos quadros de vídeo para publicação.