Exemple de code Android pour le partage d'écran

Vue d'ensemble

Ce guide explique comment utiliser le SDK Android pour publier une vidéo de partage d'écran.

Mise en place du projet

Le code de cette section est disponible dans le projet Screen-Sharing-Java du projet opentok-android-sdk-samples repo. Si vous ne l'avez pas encore fait, vous devrez cloner le repo dans un répertoire local. Sur la ligne de commande, exécutez :

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

Ouvrir le Partage d'écran-Java dans Android Studio.

Important : Veuillez noter que votre ID de l'application est votre Clé API.

Explorer le code

Les MainActivity La classe utilise WebView comme source de la vidéo de partage d'écran du flux publié.

Dans le cadre de la initializePublisher() de la méthode MainActivity après avoir créé un objet Publisher.Builder, le code appelle la fonction capturer() de la méthode Publisher.Builder en lui passant un ScreenSharingCapturer comme paramètre :

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

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

ScreenSharingCapturer est une classe personnalisée qui étend la classe BaseVideoCapturer (définie dans le SDK de Vonage Video). Cette classe vous permet de définir un capteur vidéo personnalisé qui sera utilisé par un éditeur de Vonage Video. Le constructeur de la classe ScreenSharingCapturer reçoit un objet Android View, que le capteur utilisera comme source de la vidéo.

Les getCaptureSettings() initialise les paramètres de capture à utiliser par le capteur vidéo personnalisé :

@Override
public CaptureSettings getCaptureSettings() {

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

Les startCapture() démarre la méthode frameProducer après 1/15 de seconde :

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

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

Les frameProducer reçoit un Bitmap représentation de la contentView(l'objet WebView), écrit ses pixels dans un tampon, puis appelle la fonction provideIntArrayFrame() en passant ce tampon en paramètre :

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

        }
    }
};

Les provideIntArrayFrame<()/code> définie par la méthode BaseVideoCapturer envoie un tableau entier de données à l'éditeur, qui sera utilisé pour la prochaine image vidéo publiée.

Si l'éditeur est toujours en train de capturer de la vidéo, le fil de discussion recommence après 1/15 de seconde, de sorte que le capteur continue à fournir à l'éditeur de nouvelles images vidéo à publier.