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

El SDK de OpenTok para Android incluye métodos que permiten a los clientes de Android 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 setPublishCaptions() método del objeto PublisherKit:

publisher.setPublishCaptions(true);

Si el editor no incluye una pista de audio, el PublisherKit.PublisherListener.onError() se llama con un error (con el método code del error establecida en PublisherMissingAudioTrack).

El SDK de Vonage para Android 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 escuche los eventos de subtítulos. (Consulta la siguiente sección.)

Suscribirse a los subtítulos en directo

Un abonado puede activar o desactivar los subtítulos llamando al subscribeToCaptions() método del objeto SubscriberKit:

subscriber.setSubscribeToCaptions(true);

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, pase false en el método:

subscriber.setSubscribeToCaptions(false);

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

boolean isSubscribed = subscriber.getSubscribeToCaptions();

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. Utiliza el SubscriberKit.CaptionsListener para configurar un receptor de eventos de subtítulos:

SubscriberKit.CaptionsListener captionsListener = new SubscriberKit.CaptionsListener() {
    @Override
    public void onCaptionText(SubscriberKit subscriber, String text, boolean isFinal) {
        // Display the text in the UI.
    }
}

El hasCaptions() de un objeto Stream indica si el flujo tiene subtítulos:

boolean hasCaptions = stream.hasCaptions();

Implementar el onStreamHasCaptionsChanged() método del Session.StreamPropertiesListener para controlar cuándo un flujo tiene subtítulos activados y desactivados:

Session.StreamPropertiesListener captioningListener = new Session.StreamPropertiesListener() {
    @Override
    public void onStreamHasCaptionsChanged(Session session, Stream stream, boolean hasCaptions) {
        // Adjust UI to indicate that captions are or are not available.
    }
}

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 setPublishCaptions() introduciendo true:

    publisher = new Publisher.Builder(this).name(mUsername).build();
	publisher.setPublishCaptions(true);

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

@Override
public void onStreamCreated(PublisherKit publisher, Stream stream) {
	Log.d(LOG_TAG, "onStreamCreated: Publisher Stream Created. Own stream " + stream.getStreamId());
	subscriber = new Subscriber.Builder(MainActivity.this, stream).build();
	subscriber.setSubscribeToAudio(false);
	subscriber.setSubscribeToVideo(true); // This is a workaround for an OpenTok bug.
	subscriber.setSubscribeToCaptions(true);
	subscriber.setCaptionsListener(this);

	selfPublisherStreamId = stream.getStreamId();
}

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:

@Override
public void onStreamReceived(Session session, Stream stream) {
	Log.d(TAG, "onStreamReceived: New Stream Received " + stream.getStreamId() + " in session: " + session.getSessionId());

	if(stream.getStreamId() == selfPublisherStreamId) {
		return;
	}

	// Show subscriber in the UI
	if (subscriber == null) {
		subscriber = new Subscriber.Builder(MainActivity.this, stream).build();
		subscriber.getRenderer().setStyle(BaseVideoRenderer.STYLE_VIDEO_SCALE, BaseVideoRenderer.STYLE_VIDEO_FILL);
		subscriber.setSubscriberListener(subscriberListener);
		session.subscribe(subscriber);
		subscriberViewContainer.addView(subscriber.getView());
	}
}

El suscriptor dispone del texto transcrito (correspondiente a tu transmisión publicada) en el onCaptionText() oyente:

@Override
public void onCaptionText(SubscriberKit subscriber, String text, boolean isFinal) {
    // Adjust UI to show captions.
}