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

El SDK de OpenTok para Linux incluye funciones que permiten a los clientes de Linux 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 llamando a la función otc_publisher_set_publish_captions() función:

otc_publisher_set_publish_captions(publisher, OTC_FALSE);

Si el editor no incluye una pista de audio, el otc_publisher_callbacks.on_error() devolución de llamada con un error, con el código de error establecido en OTC_PUBLISHER_MISSING_AUDIO_TRACK.

El SDK de Vonage Linus 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) para que escuche 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 llamando a la tecla otc_subscriber_set_subscribe_to_captions() función:

otc_subscriber_set_subscribe_to_captions(subscriber, OTC_TRUE);

Puedes llamar a esta función independientemente de si el emisor del flujo está publicando subtítulos en directo en ese momento. El suscriptor empezará a recibir datos de subtítulos en cuanto el emisor comience a publicar subtítulos.

Para dejar de recibir subtítulos, pase OTC_FALSE en la función:

otc_subscriber_set_subscribe_to_captions(subscriber, OTC_FALSE);

Los suscriptores pueden comprobar si tienen activado el servicio de subtítulos en directo de una retransmisión mediante el Verify otc_subscriber_get_subscribe_to_captions() función:

otc_bool isSubscribed = otc_subscriber_get_subscribe_to_captions(subscriber);

Los suscriptores reciben los subtítulos a través de eventos. El SDK de OpenTok no muestra el texto de los subtítulos en la interfaz de usuario. Configura el on_caption_text() función de miembro de la otc_subscriber_callbacks ejemplo para configurar un oyente de eventos de subtítulos:

static void on_caption_text(otc_subscriber *subscriber,
                                      void *user_data,
                                      const char* text) {
    // Display the text in the UI.
}

subscriber_callbacks.on_caption_text = on_caption_text;

El otc_stream_has_captions() informa de si un flujo tiene subtítulos:

otc_bool hasCaptions = otc_stream_has_captions(stream);

Implementar el on_stream_has_captions_changed() función de miembro de la otc_session_callbacks para supervisar cuándo un flujo tiene subtítulos activados y desactivados:

static void on_stream_has_captions_changed(otc_session* session,
                                                   void *user_data,
                                             otc_stream *stream,
                                                  otc_bool has_captions) {
  // Adjust UI to indicate that captions are or are not available.
}

session_callbacks.on_stream_has_captions_changed = on_stream_has_captions_changed;

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 llama a la función otc_publisher_set_publish_captions() función, pasando como parámetro TRUE:

    session_data->publisher = otc_publisher_new("vonage-linux-sdk-samples",
                                              NULL, /* Use WebRTC's video capturer. */
                                              &publisher_callbacks);
	otc_publisher_set_publish_captions(session_data->publisher, TRUE);

Suscríbete al canal en la página del editor on_publisher_stream_created() función de devolución de llamada:

static void on_publisher_stream_created(otc_publisher *publisher,
                                        void *user_data,
                                        const otc_stream *stream) {
	printf("on_session_stream_received: streamId=%s", otc_stream_get_id(stream));
	subscriber_callbacks.on_caption_text = on_caption_text;
	otc_subscriber *subscriber = otc_subscriber_new(strcpy, &subscriber_callbacks);
    
	if (otc_session_subscribe(session, subscriber) == OTC_SUCCESS) {
		session_data_local->subscriber = subscriber;
		session_data_local->sub_stream = stream;

		otc_subscriber_set_subscribe_to_audio(session_data_local->subscriber, FALSE);
		otc_subscriber_set_subscribe_to_video(session_data_local->subscriber, TRUE); // This is a workaround for an OpenTok bug.
		otc_subscriber_set_subscribe_to_captions(session_data_local->subscriber, TRUE);

		self_publisher_stream_id = otc_stream_get_id(stream);
	}
}

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:

static void on_subscriber_connected(otc_subscriber *subscriber,
                                    void *user_data,
                                    const otc_stream *stream) {
  	printf("on_subscriber_connected: streamId=%s ", otc_stream_get_id(stream));

  	if(otc_stream_get_id(otc_stream) == selfPublisherStreamId) {
		return;
	}

	// Show other subscribers in the UI
}

El suscriptor dispone del texto transcrito (correspondiente a tu transmisión publicada) en la siguiente llamada de retorno:

void on_caption_text(otc_subscriber* subscriber,
                          void* user_data,
                          const char* text,
                          otc_bool is_final) {
	// Adjust UI to show captions.
	otc_stream* stream = otc_subscriber_get_stream(subscriber);
	if (strcmp(otc_stream_get_id(stream), self_publisher_stream_id) == 0)
    {
        // text is your own audio as transcribed text or captions
        printf("My own caption %s", text);
    } else {
        // other subscribers captions
    }
}