Renderización de vídeo personalizada (Android)

Visión general

Este tutorial explica paso a paso los pasos necesarios para realizar modificaciones menores en el renderizador de vídeo que utiliza un Subscriber objeto. También puedes utilizar las mismas técnicas para modificar el renderizador de vídeo que utiliza un Publisher objeto (aunque este ejemplo solo ilustra un renderizador personalizado para un suscriptor).

Configuración de tu proyecto

El código de esta sección está disponible en el proyecto Basic-Video-Renderer-Java del archivo opentok-android-sdk-ejemplos repositorio. Si aún no lo has hecho, tendrás que clonar el repositorio en un directorio local. En la línea de comandos, ejecuta:

git clone git@github.com:opentok/opentok-android-sdk-samples.git

Abra el Basic-Video-Renderer-Java proyecto en Android Studio para seguir el tutorial.

Explorar el código

En este ejemplo, la aplicación utiliza un renderizador de vídeo personalizado para mostrar una versión en color invertida del vídeo.

InvertedColorsVideoRenderer es una clase personalizada que hereda de la BaseVideoRenderer clase (definida en el SDK de OpenTok para Android). La BaseVideoRenderer La clase te permite definir un renderizador de vídeo personalizado para que lo utilice un editor o un suscriptor de OpenTok:

subscriber = new Subscriber.Builder(this, stream)
    .renderer(new InvertedColorsVideoRenderer(this))
    .build();
publisher = new Publisher.Builder(MainActivity.this)
    .renderer(new InvertedColorsVideoRenderer(MainActivity.this))
    .build();

El InvertedColorsVideoRenderer() El constructor establece un renderer a una propiedad GLSurfaceView objeto. La aplicación utiliza este objeto para mostrar el vídeo mediante OpenGL ES 2.0. El motor de renderizado para este GLSurfaceView el objeto se establece en un MyRenderer objeto. MyRenderer es una clase personalizada que extiende GLSurfaceView.Renderery se utiliza para renderizar el vídeo en el GLSurfaceView objeto:

public InvertedColorsVideoRenderer(Context context) {
    view = new GLSurfaceView(context);
    view.setEGLContextClientVersion(2);

    renderer = new MyRenderer();
    view.setRenderer(renderer);

    view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}

El onFrame() El método del renderizador de vídeo se hereda del BaseVideoRenderer clase. En BaseVideoRenderer.onFrame() es llamado cuando el editor (o suscriptor) renderiza un fotograma de vídeo al renderizador de vídeo. La dirección InvertedColorsVideoRenderer de este método, toma el búfer de imagen del fotograma (YUV representación del marco), se la pasa al displayFrame método del MyRenderer objeto y llama a la requestRender() método del GLSurfaceView objeto:

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

Para renderizar los fotogramas de vídeo, la clase renderer utiliza shaders OpenGL. En este ejemplo el shader produce el efecto de color invertido, más precisamente esto se logra por esta línea que está dentro de la clase fragmentShaderCode cadena:

"y=1.0-1.1643*(y-0.0625);\n"

¡Enhorabuena! Has completado el tutorial sobre renderización de vídeo personalizada para Android.
Puedes seguir probando y modificando el código que has creado aquí, o echar un vistazo a la Próximos pasos abajo.

Próximos pasos

Cuando hayas terminado aquí, sigue desarrollando y mejorando tu aplicación de OpenTok con estos útiles recursos: