Ejemplo de código de Android para compartir pantalla

Visión general

Esta guía explica cómo utilizar el SDK de Android para publicar un vídeo en el que se comparte la pantalla.

Configuración del proyecto

El código de esta sección está disponible en el proyecto Screen-Sharing-Java del proyecto 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 Screen-Sharing-Java proyecto en Android Studio para seguir el tutorial.

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

Explorar el código

El 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 objeto, pasando un 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 hereda de la BaseVideoCapturer clase (definida en el SDK de Vonage Video). Esta clase te permite definir un capturador de vídeo personalizado para que lo utilice un editor de Vonage Video. El constructor de la ScreenSharingCapturer A la clase se le pasa un objeto View de Android, que el capturador utilizará como fuente del vídeo.

El getCaptureSettings() Este método inicializa los parámetros 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;
}

El startCapture() inicia el método frameProducer hilo tras 1/15 de segundo:

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

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

El 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);

        }
    }
};

El 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 ciclo vuelve a comenzar tras otro 1/15 de segundo, de modo que el capturador sigue proporcionando al editor nuevos fotogramas de vídeo para su publicación.