Subtítulos en directo — SDK de Vonage Video para iOS

El SDK de OpenTok para iOS incluye métodos que permiten a los clientes de iOS publicar y recibir subtítulos en una sesión de OpenTok.

La subtitulación en directo debe activarse a nivel de sesión a través de la API REST.

Los subtítulos en directo sólo se admiten en sesiones enrutadas.

Este tema incluye las siguientes secciones:

Publicación de subtítulos en directo

Un editor de OpenTok puede iniciar o detener la publicación de subtítulos en directo en tiempo real configurando el publishCaptions del objeto OTPublisherKit:

publisher.publishCaptions = YES;

Si el editor no incluye una pista de audio, el [PublisherKit publisher:didFailWithError:] con el mensaje code del error establecida en OTPublisherMissingAudioTrack.

El SDK de Vonage para iOS no permite que un emisor reciba eventos relacionados con sus propios subtítulos. Para mostrar los subtítulos del propio locutor, crea un suscriptor oculto (al flujo del emisor) para que reciba los eventos de subtítulos. (Consulta la siguiente sección.)

Suscribirse a los subtítulos en directo

Un abonado puede iniciar o detener la recepción de subtítulos configurando la opción subscribeToCaptions propiedad del objeto OTSubscriberKit:

subscriber.subscribeToCaptions = YES;

Puede llamar a este método independientemente de si el editor de la secuencia está publicando actualmente subtítulos en directo. El suscriptor comenzará a recibir datos de subtítulos una vez que el editor comience a a publicar subtítulos.

Para dejar de recibir subtítulos, configura la propiedad en NO:

subscriber.setSubscribeToCaptions = NO;

El [OTSubscriberKitCaptionsDelegate subscriber:caption:isFinal:] se envía cuando un recibe subtítulos:

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

Puedes configurar un observador de clave-valor para el hasCaptions de un OTStream para ver cuándo el flujo tiene subtítulos activados y desactivados:

//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
}

Cómo recibir tus propios subtítulos en directo

La Video API de Vonage no permite que un emisor reciba eventos relacionados con sus propios subtítulos. Para mostrar los subtítulos del propio hablante, crea un suscriptor oculto (al flujo del emisor local) para que detecte los eventos de subtítulos. No muestres la vista de este suscriptor en la interfaz de usuario y no te suscribas a su audio (para evitar el eco). A continuación, puedes añadir el texto de los subtítulos a la interfaz de usuario.

Por defecto, el editor no publica los pies de foto, así que configura el publishCaptions propiedad de la editorial a TRUE:

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

Suscríbete a la retransmisión en el [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;
}

Como se ha indicado anteriormente, debes suscribirte al canal de vídeo para poder ver los subtítulos. (Esto se solucionará en una versión futura.)

En este ejemplo se almacena el ID de la transmisión del editor en un _selfPublisherStreamId variable, que aquí se utiliza para evitar que su vista se añada a la interfaz de usuario:

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

El suscriptor dispone del texto transcrito (correspondiente a tu transmisión publicada) en el siguiente 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
    }
}