Kotlin

Criação do renderizador de vídeo invertido

InvertedColorsVideoRenderer é o seu principal renderizador personalizado. Essa classe se integra diretamente ao SDK do Vonage Video. Ela NÃO realiza a renderização do vídeo por conta própria — ela delega toda a renderização ao MyRenderer.

Principais responsabilidades:

  • Criar e configurar um GLSurfaceView
  • Receber quadros de vídeo de Vonage Video SDK (onFrame)
  • Passe-os para o OpenGL renderizador
  • Lidar com o redimensionamento de vídeo (“ajustar”, “preencher”)`
  • Pause/resume renderização
  1. Crie um arquivo Kotlin separado com o InvertedColorsVideoRenderer

O InvertedColorsVideoRenderer() O construtor define uma propriedade do renderizador como um GLSurfaceView objeto. O aplicativo usa esse objeto para exibir o vídeo por meio de OpenGL ES 2.0. O renderizador para isso GLSurfaceView o objeto está definido como um MyRenderer objeto. MyRenderer é uma classe personalizada que vamos criar, que estende GLSurfaceView.Renderer, e é usado para renderizar o vídeo para o GLSurfaceView objeto

class InvertedColorsVideoRenderer(private val context: Context) : BaseVideoRenderer() {

    private val view: GLSurfaceView
    private val renderer: MyRenderer

    interface InvertedColorsVideoRendererMetadataListener {
        fun onMetadataReady(metadata: ByteArray)
    }

    init {
        view = GLSurfaceView(context)
        view.setEGLContextClientVersion(2)

        renderer = MyRenderer()
        view.setRenderer(renderer)

        view.renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY
    }

    override fun onFrame(frame: Frame) {
        renderer.displayFrame(frame)
        view.requestRender()
    }

    override fun setStyle(key: String, value: String) {
        if (BaseVideoRenderer.STYLE_VIDEO_SCALE == key) {
            when (value) {
                BaseVideoRenderer.STYLE_VIDEO_FIT -> renderer.enableVideoFit(true)
                BaseVideoRenderer.STYLE_VIDEO_FILL -> renderer.enableVideoFit(false)
            }
        }
    }

    override fun onVideoPropertiesChanged(videoEnabled: Boolean) {
        renderer.disableVideo(!videoEnabled)
    }

    override fun getView(): View {
        return view
    }

    override fun onPause() {
        view.onPause()
    }

    override fun onResume() {
        view.onResume()
    }
}
  1. Explore o código criado e veja o que ele faz.
  • Vonage Video SDK chamadas onFrame() para cada quadro recebido
  • Entregamos a moldura ao OpenGL renderizador renderer.displayFrame()
  • Pedimos GLSurfaceView para sortear imediatamente requestRender()
  • Isso estabelece uma separação clara entre Vonage Video SDK lógica e OpenGL lógica.
  1. Vamos dar uma olhada mais de perto no onFrame() método do renderizador de vídeo

É herdado do BaseVideoRenderer classe. A BaseVideoRenderer.onFrame() O método é chamado quando o editor (ou assinante) envia um quadro de vídeo ao renderizador de vídeo. O InvertedColorsVideoRenderer Na implementação desse método, ele pega o buffer de imagem do quadro (representação YUV do quadro) e o passa para o displayFrame método do MyRenderer objeto e chama o requestRender() método do GLSurfaceView objeto:

@Override
public void onFrame(Frame frame) {
    renderer.displayFrame(frame);
    view.requestRender();
}