Tutorial sobre compartilhamento de tela (iOS)

Visão geral

Este tutorial mostra como usar o SDK do OpenTok para iOS para publicar um vídeo de compartilhamento de tela, utilizando a tela do dispositivo como fonte do vídeo da transmissão.

Configurando seu projeto

O código desta seção está no Compartilhamento de tela pasta do exemplos-do-opentok-ios-sdk projeto no GitHub. Caso ainda não tenha feito isso, você precisará clonar o repositório em um diretório local — isso pode ser feito usando a linha de comando:

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

O aplicativo Screen-Sharing mostra como capturar a tela (uma UIView) usando um capturador de vídeo personalizado. Abra o projeto no Xcode para acompanhar o passo a passo.

Explorando o código

O capturador de vídeo personalizado, o TBScreenCapture, é inicialmente inicializado com um objeto de ligação de tela. Esse objeto chama a função captureView método a 30 quadros por segundo.

. O createPixelBuffer e createCGContextFromPixelBuffer Os métodos auxiliares preparam o terreno para armazenar o instantâneo da tela principal. Esse buffer é então enviado para o videoCaptureConsumer no captureView método.


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

O instantâneo é capturado usando [self.view.layer renderInContext:self->_bitmapContext].

O aplicativo de exemplo utiliza os métodos de protocolo do OTVideoCapture para gerenciar o objeto de ligação de exibição, juntamente com um _capturing bandeira. A captureSettings O método define o videoFormat como OTPixelFormatARGB.

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

A classe ViewController cria uma sessão, instancia os assinantes e configura o editor.

O publisher é o principal motor do aplicativo, e suas propriedades e métodos — videoType, audioFallbackEnabled, videoContentHint, e setVideoCapture — se passam no doPublish método:

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

    ...
}

Por fim, o aplicativo exibe um texto com o cronômetro em andamento. O aplicativo captura essa exibição e a compartilha com os assinantes:


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

Parabéns! Você concluiu o tutorial sobre compartilhamento de tela no iOS.
Você pode continuar experimentando e ajustando o código que desenvolveu aqui, ou conferir o Próximos passos abaixo. Para obter mais informações sobre o compartilhamento de tela com o OpenTok, consulte o Guia do desenvolvedor do OpenTok para compartilhamento de tela no iOS.

Próximos passos

Quando terminar esta seção, continue desenvolvendo e aprimorando seu aplicativo OpenTok com estes recursos úteis: