Exemplo de código Android para compartilhamento de tela

Visão geral

Este guia mostra como usar o SDK do Android para publicar um vídeo de compartilhamento de tela.

Configurando seu projeto

O código desta seção está disponível no projeto Screen-Sharing-Java do exemplos-do-opentok-android-sdk repositório. Caso ainda não tenha feito isso, você precisará clonar o repositório em um diretório local. Na linha de comando, execute:

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

Abra o Compartilhamento de tela - Java projeto no Android Studio para acompanhar.

Importante: Observe que o seu ID do aplicativo é o seu Chave de API.

Explorando o código

O MainActivity usos da classe WebView objeto como fonte do vídeo de compartilhamento de tela da transmissão publicada.

No initializePublisher() método do MainActivity Na classe, após criar um objeto Publisher.Builder, o código chama o capturer() método do Publisher.Builder objeto, passando um ScreenSharingCapturer objeto como parâmetro:

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

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

ScreenSharingCapturer é uma classe personalizada que estende a BaseVideoCapturer classe (definida no SDK do Vonage Video). Essa classe permite definir um capturador de vídeo personalizado para ser usado por um editor do Vonage Video. O construtor da ScreenSharingCapturer A classe recebe como parâmetro um objeto View do Android, que o capturador utilizará como fonte do vídeo.

O getCaptureSettings() O método inicializa as configurações de captura a serem utilizadas pelo 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;
}

O startCapture() O método inicia o frameProducer rosca após 1/15 de segundo:

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

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

O frameProducer o thread recebe um Bitmap representação do contentViewobjeto (o WebView), grava seus pixels em um buffer e, em seguida, chama a função provideIntArrayFrame() método, passando esse buffer 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);

        }
    }
};

O provideIntArrayFrame<()/code> método, definido pelo BaseVideoCapturer A classe envia uma matriz de inteiros com dados ao editor, para serem usados no próximo quadro de vídeo publicado.

Se o editor ainda estiver capturando vídeo, o ciclo recomeça após mais 1/15 de segundo, de modo que o capturador continue a fornecer ao editor novos quadros de vídeo para publicação.