Ejemplo de código Android para compartir pantalla

Visión general

Esta guía muestra cómo utilizar el SDK de Android para publicar un vídeo de pantalla compartida.

Configuración del proyecto

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

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

Abra el Screen-Sharing-Java en Android Studio.

Importante: Tenga en cuenta que su ID de la aplicación es tu Clave API.

Explorar el código

En MainActivity usos de la clase WebView como fuente para el vídeo de pantalla compartida del flujo publicado.

En el initializePublisher() método del MainActivity después de crear un objeto Publisher.Builder, el código llama a la clase capturer() método del Publisher.Builder pasando un objeto ScreenSharingCapturer como parámetro:

ScreenSharingCapturer screenSharingCapturer = new ScreenSharingCapturer(MainActivity.this, webViewContainer);

publisher = new Publisher.Builder(MainActivity.this)
        .capturer(screenSharingCapturer)
        .build();

ScreenSharingCapturer es una clase personalizada que amplía la clase BaseVideoCapturer (definida en el SDK de Vonage Video). Esta clase te permite definir una capturadora de video personalizada para ser utilizada por un editor de Vonage Video. El constructor de la clase ScreenSharingCapturer se le pasa un objeto Android View, que la capturadora utilizará como fuente para el vídeo.

En getCaptureSettings() inicializa la configuración de captura que utilizará el capturador de vídeo personalizado:

@Override
public CaptureSettings getCaptureSettings() {

    CaptureSettings captureSettings = new CaptureSettings();
    captureSettings.fps = fps;
    captureSettings.width = width;
    captureSettings.height = height;
    captureSettings.format = ARGB;
    return captureSettings;
}

En startCapture() inicia el método frameProducer después de 1/15 segundos:

@Override
public int startCapture() {
    capturing = true;

    handler.postDelayed(newFrame, 1000 / fps);
    return 0;
}

En frameProducer obtiene un Bitmap representación de la contentView(el objeto WebView), escribe sus píxeles en un búfer y, a continuación, llama a la función provideIntArrayFrame() pasando ese búfer como parámetro:

private Runnable newFrame = new Runnable() {
    @Override
    public void run() {
        if (capturing) {
            int width = contentView.getWidth();
            int height = contentView.getHeight();

            if (frame == null ||
                    ScreenSharingCapturer.this.width != width ||
                    ScreenSharingCapturer.this.height != height) {

                ScreenSharingCapturer.this.width = width;
                ScreenSharingCapturer.this.height = height;

                if (bmp != null) {
                    bmp.recycle();
                    bmp = null;
                }

                bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

                canvas = new Canvas(bmp);
                frame = new int[width * height];
            }
            canvas.saveLayer(0, 0, width, height, null);
            canvas.translate(-contentView.getScrollX(), - contentView.getScrollY());
            contentView.draw(canvas);

            bmp.getPixels(frame, 0, width, 0, 0, width, height);

            provideIntArrayFrame(frame, ARGB, width, height, 0, false);

            canvas.restore();

            handler.postDelayed(newFrame, 1000 / fps);

        }
    }
};

En provideIntArrayFrame<()/code> 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 hilo vuelve a empezar tras otro 1/15 de segundo, de modo que la capturadora sigue suministrando al editor nuevos fotogramas de vídeo para publicar.