Kotlin

Erstellen des Renderers für invertierte Videos

InvertedColorsVideoRenderer ist Ihr wichtigster benutzerdefinierter Renderer. Diese Klasse ist direkt mit dem Vonage Video SDK verbunden. Sie rendert das Video NICHT selbst, sondern delegiert das gesamte Rendering an MyRenderer.

Hauptaufgaben:

  • Erstellen und Konfigurieren eines GLSurfaceView
  • Empfangen von Videobildern von Vonage Video SDK (onFrame)
  • Geben Sie sie an die OpenGL Renderer
  • Handhabung der Skalierung von Videos ("fit", "fill")`
  • Pause/resume Rendering
  1. Erstellen Sie eine separate Kotlin-Datei mit dem InvertedColorsVideoRenderer

Die InvertedColorsVideoRenderer() Konstruktor setzt eine Renderer-Eigenschaft auf eine GLSurfaceView Objekt. Die App verwendet dieses Objekt, um das Video mithilfe von OpenGL ES 2.0. Der Renderer für diese GLSurfaceView Objekt wird auf ein MyRenderer Objekt. MyRenderer ist eine benutzerdefinierte Klasse, die wir erstellen werden und die GLSurfaceView.Rendererund wird zum Rendern des Videos auf dem Computer verwendet. GLSurfaceView Objekt

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. Erkunden Sie den erstellten Code und seine Funktionen.
  • Vonage Video SDK ruft auf. onFrame() für jedes eingehende Bild
  • Wir übergeben den Rahmen an die OpenGL Renderer renderer.displayFrame()
  • Wir fragen GLSurfaceView sofort zu zeichnen requestRender()
  • Dadurch wird eine saubere Trennung zwischen Vonage Video SDK Logik und OpenGL Logik.
  1. Werfen wir einen genaueren Blick auf die onFrame() Methode des Video-Renderers

Sie wird geerbt von der BaseVideoRenderer Klasse. Die Website BaseVideoRenderer.onFrame() Methode wird aufgerufen, wenn der Herausgeber (oder Abonnent) ein Videobild an den Videorenderer überträgt. Die InvertedColorsVideoRenderer Implementierung dieser Methode wird der Bildpuffer des Bildes (YUV-Darstellung des Bildes) genommen und an die displayFrame Methode der MyRenderer Objekt und ruft das Objekt requestRender() Methode der GLSurfaceView Objekt:

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