Anleitung zur Bildschirmfreigabe (iOS)

Übersicht

In diesem Tutorial wird gezeigt, wie man mit dem OpenTok iOS SDK ein Bildschirmfreigabe-Video veröffentlicht, wobei der Bildschirm des Geräts als Quelle für das Stream-Video dient.

Einrichten Ihres Projekts

Der Code für diesen Abschnitt befindet sich in der Bildschirmfreigabe Ordner des opentok-ios-sdk-Beispiele Projekt auf GitHub. Falls Sie dies noch nicht getan haben, müssen Sie das Repository in ein lokales Verzeichnis klonen – dies können Sie über die Befehlszeile tun:

git clone https://github.com/opentok/opentok-ios-sdk-samples.git

Die Anwendung „Screen-Sharing“ zeigt Ihnen, wie Sie den Bildschirm (eine UIView) mithilfe eines benutzerdefinierten Video-Capturers aufzeichnen können. Öffnen Sie das Projekt in XCode, um die Anleitung mitzuverfolgen.

Den Code erkunden

Der benutzerdefinierte Video-Capturer „TBScreenCapture“ wird zunächst mit einem Display-Link-Objekt initialisiert. Dieses Objekt ruft die captureView Methode mit 30 Bildern pro Sekunde.

. Die createPixelBuffer und createCGContextFromPixelBuffer Hilfsmethoden bereiten die Speicherung des Momentaufnahmes des Hauptbildschirms vor. Dieser Puffer wird dann an die videoCaptureConsumer im captureView Methode.


- (instancetype)initWithView:(UIView *)view
{
    self = [super init];
    if (self) {
        _view = view;
        _queue = dispatch_queue_create("SCREEN_CAPTURE", NULL);
        _screenScale = [[UIScreen mainScreen] scale];
        _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(captureView)];
        _displayLink.preferredFramesPerSecond = 30.0;
        _capturingSemaphore = dispatch_semaphore_create(1);
        [self createPixelBuffer];
        [self createCGContextFromPixelBuffer];
    }
    return self;
}

-(void)captureView
{
    if (!(_capturing && self.videoCaptureConsumer)) {
        return;
    }

    // Wait until consumeImageBuffer is done.
    if (dispatch_semaphore_wait(_capturingSemaphore, DISPATCH_TIME_NOW) != 0) {
            return;
    }
    
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.view.layer renderInContext:self->_bitmapContext]; 
        // Don't block the UI thread
        dispatch_async(self->_queue, ^{
            CMTime time = [self getTimeStamp];
            [self.videoCaptureConsumer consumeImageBuffer:self->_pixelBuffer
                orientation:OTVideoOrientationUp
                timestamp:time
                metadata:nil];
            // Signal for more frames
            dispatch_semaphore_signal(self->_capturingSemaphore);
        });
    });
}

Der Schnappschuss wird aufgenommen mit [self.view.layer renderInContext:self->_bitmapContext].

Die Beispiel-App nutzt die Protokollmethoden von OTVideoCapture, um das Display-Link-Objekt zusammen mit einem _capturing Flag. Das captureSettings Die Methode setzt das videoFormat auf OTPixelFormatARGB.

- (int32_t)captureSettings:(OTVideoFormat*)videoFormat
    {
        videoFormat.pixelFormat = OTPixelFormatARGB;
        return 0;
    }

Die Klasse „ViewController“ erstellt eine Sitzung, instanziiert Abonnenten und richtet den Publisher ein.

Der Publisher ist das Herzstück der App, und seine Eigenschaften und Methoden — videoType, audioFallbackEnabled, videoContentHintund setVideoCapture — spielen in der doPublish Methode:

- (void)doPublish
{
    ...

    [_publisher setVideoType:OTPublisherKitVideoTypeScreen];
    
    // This disables the audio fallback feature when using routed sessions.
    _publisher.audioFallbackEnabled = NO;

    // Finally, wire up the video source.
    TBScreenCapture* videoCapture =
    [[TBScreenCapture alloc] initWithView:self.view];
    [_publisher setVideoCapture:videoCapture];

    _publisher.videoCapture.videoContentHint = OTVideoContentHintText;

    ...
}

Zu guter Letzt fügt die App eine Textanzeige mit einem laufenden Timer hinzu. Die App erfasst diese Anzeige und teilt sie mit den Abonnenten:


dispatch_source_set_event_handler(_timer, ^{
    double timestamp = [[NSDate date] timeIntervalSince1970];
    int64_t timeInMilisInt64 = (int64_t)(timestamp*1000);
    
    NSString *mills = [NSString stringWithFormat:@"%lld", timeInMilisInt64];
    
    dispatch_sync(dispatch_get_main_queue(), ^{
        [self.timeDisplay setText:mills];
    });
});

Herzlichen Glückwunsch! Du hast das Tutorial zur Bildschirmfreigabe für iOS abgeschlossen.
Du kannst den Code, den du hier entwickelt hast, weiter ausprobieren und anpassen oder dir die Nächste Schritte unten. Weitere Informationen zur Bildschirmfreigabe mit OpenTok finden Sie unter OpenTok-Entwicklerhandbuch zur Bildschirmfreigabe für iOS.

Nächste Schritte

Wenn Sie hier fertig sind, können Sie Ihre OpenTok-Application mit diesen hilfreichen Ressourcen weiter ausbauen und verbessern: