Android-Codebeispiel für die Bildschirmfreigabe

Übersicht

In dieser Anleitung wird gezeigt, wie man mit dem Android SDK ein Screen-Sharing-Video veröffentlicht.

Ihr Projekt einrichten

Der Code für diesen Abschnitt ist im Screen-Sharing-Java-Projekt des opentok-android-sdk-Beispiele Repo. Wenn Sie dies noch nicht getan haben, müssen Sie das Projektarchiv in ein lokales Verzeichnis klonen. Führen Sie in der Befehlszeile Folgendes aus:

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

Öffnen Sie die Bildschirm-Sharing-Java Projekt in Android Studio, um die Entwicklung zu verfolgen.

Das ist wichtig: Bitte beachten Sie, dass Ihr App-ID ist Ihr API-Schlüssel.

Erforschung des Codes

Die MainActivity Klasse verwendet WebView Objekt als Quelle für das Screen-Sharing-Video des veröffentlichten Streams.

In der initializePublisher() Methode der MainActivity Klasse, ruft der Code nach dem Erstellen eines Publisher.Builder-Objekts die capturer() Methode der Publisher.Builder Objekt und übergibt eine ScreenSharingCapturer Objekt als Parameter:

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

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

ScreenSharingCapturer ist eine benutzerdefinierte Klasse, die die BaseVideoCapturer Klasse (definiert im Vonage Video SDK). Mit dieser Klasse können Sie einen benutzerdefinierten Video-Capturer definieren, der von einem Vonage Video Publisher verwendet wird. Der Konstruktor der Klasse ScreenSharingCapturer Klasse wird ein Android-Ansichtsobjekt übergeben, das der Capturer als Quelle für das Video verwenden wird.

Die getCaptureSettings() Methode initialisiert die Aufnahmeeinstellungen, die vom benutzerdefinierten Video-Capturer verwendet werden sollen:

@Override
public CaptureSettings getCaptureSettings() {

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

Die startCapture() Methode startet die frameProducer Thread nach 1/15 Sekunde:

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

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

Die frameProducer Thread erhält eine Bitmap Darstellung der contentViewObjekt (das WebView), schreibt seine Pixel in einen Puffer und ruft dann die provideIntArrayFrame() Methode und übergibt diesen Puffer als Parameter:

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

        }
    }
};

Die provideIntArrayFrame<()/code> Methode, definiert durch den BaseVideoCapturer Klasse sendet ein ganzzahliges Datenfeld an den Herausgeber, das für das nächste veröffentlichte Videobild verwendet werden soll.

Wenn der Herausgeber immer noch Videos aufnimmt, wird der Thread nach einer weiteren 1/15-Sekunde erneut gestartet, so dass der Aufzeichner den Herausgeber weiterhin mit neuen Videobildern zur Veröffentlichung versorgt.