Tutoriel sur le partage d'écran (iOS)

Vue d'ensemble

Ce tutoriel explique comment utiliser le SDK OpenTok pour iOS afin de diffuser une vidéo de partage d'écran, en utilisant l'écran de l'appareil comme source vidéo du flux.

Configuration de votre projet

Le code de cette section se trouve dans la section Partage d'écran du dossier opentok-ios-sdk-échantillons projet sur GitHub. Si ce n'est pas déjà fait, vous devrez cloner le dépôt dans un répertoire local — vous pouvez le faire à l'aide de la ligne de commande :

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

L'application « Screen-Sharing » vous montre comment capturer l'écran (une UIView) à l'aide d'un outil de capture vidéo personnalisé. Ouvrez le projet dans Xcode pour suivre les étapes.

Découverte du code

Le logiciel de capture vidéo personnalisé, TBScreenCapture, est d'abord initialisé à l'aide d'un objet « display link ». Cet objet appelle la fonction captureView méthode à 30 images par seconde.

. Les createPixelBuffer et createCGContextFromPixelBuffer Des méthodes d'aide préparent le terrain pour stocker l'instantané de l'écran principal. Ce tampon est ensuite transmis à la videoCaptureConsumer dans le captureView méthode.


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

L'instantané est réalisé à l'aide de [self.view.layer renderInContext:self->_bitmapContext].

L'application d'exemple utilise les méthodes du protocole OTVideoCapture pour gérer l'objet de liaison d'affichage ainsi qu'un _capturing drapeau. Le captureSettings Cette méthode définit le paramètre « videoFormat » sur OTPixelFormatARGB.

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

La classe ViewController crée une session, instancie les abonnés et configure l'éditeur.

L'éditeur est le pilier de l'application, et ses propriétés et méthodes — videoType, audioFallbackEnabled, videoContentHintet setVideoCapture — se déroulent dans le doPublish méthode :

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

    ...
}

Enfin, l'application affiche un compte à rebours sous forme de texte. Elle capture cet affichage et le partage avec ses abonnés :


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

Félicitations ! Vous venez de terminer le tutoriel sur le partage d'écran sous iOS.
Vous pouvez continuer à tester et à modifier le code que vous avez développé ici, ou consulter le Prochaines étapes ci-dessous. Pour plus d'informations sur le partage d'écran avec OpenTok, consultez la Guide du développeur OpenTok sur le partage d'écran pour iOS.

Prochaines étapes

Une fois que vous aurez terminé cette étape, poursuivez le développement et l'amélioration de votre application OpenTok à l'aide des ressources utiles suivantes :