Legendas em tempo real — SDK do Vonage Video para iOS

O SDK do OpenTok para iOS inclui métodos para que os clientes iOS publiquem e recebam legendas em uma sessão do OpenTok.

A legenda em tempo real deve ser ativada no nível da sessão por meio do API REST.

A legenda em tempo real é compatível apenas em sessões encaminhadas.

Este tópico inclui as seguintes seções:

Publicação de legendas em tempo real

Um editor do OpenTok pode iniciar ou interromper a exibição de legendas ao vivo em tempo real configurando o publishCaptions propriedade do objeto OTPublisherKit:

publisher.publishCaptions = YES;

Se a editora não incluir uma faixa de áudio, o [PublisherKit publisher:didFailWithError:] a mensagem é enviada, com o code propriedade do conjunto de erros definida como OTPublisherMissingAudioTrack.

O SDK do Vonage para iOS não permite que um emissor receba eventos relativos às suas próprias legendas. Para exibir as legendas do próprio locutor, crie um assinante oculto (no fluxo do emissor) para monitorar os eventos de legenda. (Consulte a próxima seção.)

Inscrever-se para receber legendas em tempo real

Um assinante pode ativar ou desativar a exibição de legendas configurando o subscribeToCaptions propriedade do objeto OTSubscriberKit:

subscriber.subscribeToCaptions = YES;

Você pode chamar esse método independentemente de o emissor do stream estar ou não publicando legendas em tempo real no momento. O assinante começará a receber os dados das legendas assim que o emissor começar a publicar as legendas.

Para deixar de receber legendas, defina a propriedade como NO:

subscriber.setSubscribeToCaptions = NO;

O [OTSubscriberKitCaptionsDelegate subscriber:caption:isFinal:] A mensagem é enviada quando um assinante de um stream recebe legendas:

// OTSubscriber delegate callbacks:
-(void) subscriber:(OTSubscriberKit *)subscriber caption:(NSString *)text isFinal:(BOOL)final {
    // Display caption text in UI.
}

Você pode configurar um observador de chave-valor para o hasCaptions propriedade de um OTStream para verificar quando as legendas do stream estão ativadas ou desativadas:

//add observer on a stream of interest
[_subscriber.stream addObserver:self forKeyPath:@"hasCaptions" options:NSKeyValueObservingOptionNew context:NULL];
    
- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context {
    NSLog(@"KVO change for %@ = %@",keyPath, change); 
    //manipulate GUI element
}

Como receber suas próprias legendas em tempo real

A Video API da Vonage não permite que um emissor receba eventos relativos às suas próprias legendas. Para exibir as legendas do próprio locutor, crie um assinante oculto (no fluxo do emissor local) para monitorar os eventos de legenda. Não exiba a visualização desse assinante na interface do usuário e não se inscreva no áudio dele (para evitar eco). Em seguida, você pode adicionar o texto das legendas à interface do usuário.

Por padrão, o Publisher não publica legendas; portanto, defina o publishCaptions propriedade da editora para TRUE:

    _publisher =
    [[OTPublisher alloc] initWithDelegate:self
                                 settings:settings];
    _publisher.publishCaptions = TRUE;
    OTError *error = nil;
    [_session publish:_publisher error:&error];

Inscreva-se na transmissão no [OTPublisherKitDelegate publisher:streamCreated:] método:

- (void)publisher:(OTPublisherKit *)publisher
    streamCreated:(OTStream *)stream
{
    // Self subscribe to our own publisher stream
    _subscriber = [[OTSubscriber alloc] initWithStream:stream delegate:self];
    _subscriber.subscribeToAudio = false;
    _subscriber.subscribeToVideo = true;  // This is a workaround for an OpenTok bug.
    _subscriber.subscribeToCaptions = true;
    _subscriber.captionsDelegate = self;
    OTError *error = nil;
    [_session subscribe:_subscriber error:&error];
    if (error)
    {
        [self showAlert:[error localizedDescription]];
    }
    _selfPublisherStreamId = stream.streamId;
}

Conforme mencionado acima, é necessário se inscrever no canal para receber as legendas. (Isso será corrigido em uma versão futura.)

Este exemplo armazena o ID do stream do editor em um _selfPublisherStreamId variável, usada aqui para impedir que sua visualização seja adicionada à interface do usuário:

- (void)subscriberDidConnectToStream:(OTSubscriberKit*)subscriber
{
    if ([subscriber.stream.streamId isEqualToString:_selfPublisherStreamId]) {
        return; // Don't show the self subscriber view.
    }
    
    [_subscriber.view setFrame:CGRectMake(0, widgetHeight, widgetWidth,
                                          widgetHeight)];
    [self.view addSubview:_subscriber.view];
}

O assinante tem o texto transcrito (para sua transmissão publicada) no seguinte delegado:


- (void)subscriber:(nonnull OTSubscriberKit*)subscriber
           caption:(NSString*_Nonnull)text
           isFinal:(BOOL)isFinal {
    // Adjust UI to show captions.
    if ([subscriber.stream.streamId isEqualToString:_selfPublisherStreamId])
    {
        // text is your own audio as transcribed text or captions
        NSLog(@"My own caption %@", text);
    } else {
        // other subscribers captions
    }
}