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

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 = true

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 = 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, configura la propiedad en false:

subscriber.setSubscribeToCaptions = false

El OTSubscriberKitCaptionsDelegate(_:subscriber:caption:isFinal:) se envía cuando un recibe subtítulos:

// OTSubscriberKitDelegate callbacks:
func subscriber(_ subscriber: OTSubscriberKit, caption text: NSString, isFinal final: Bool) {
  // Display caption text in UI.
}

Puedes configurar un observador de clave-valor para el hasCaptions de un objeto OTStream para ver cuándo el flujo tiene subtítulos habilitados y deshabilitados.

//add observer on a stream of interest
let hasCaptionsObservation: NSKeyValueObservation = subscriber.stream.observe(\.hasCaptions, options: [.old, .new]) { object, change in
	guard let oldValue = change.oldValue else { return }
	guard let newValue = change.newValue else { return }
	print("KVO change for \(subscriber.stream.streamId) hasCaptions: \(newValue)")
	//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(delegate: self, settings: pubSettings!)
    publisher?.publishCaptions = true

Suscríbete a la retransmisión en el OTPublisherKitDelegate(publisher, streamCreated) método:

func publisher(_ publisher: OTPublisherKit, streamCreated stream: OTStream) {
	// Add view
	let pubView = self.publisher?.view
	if(pubView != nil) // audio only publisher
	{
		ViewUtils.addViewFill(pubView!, rootView: self.publisherView!)
	}

	let subscriber = OTSubscriber(stream: stream, delegate: self)
	subscriber.subscribeToAudio = false
	subscriber.subscribeToVideo = true // typically should be false, but due to an existing bug in 2.25.3, it is set to true. Future versions will fix the issue.
	subscriber.subscribeToCaptions = true
	subscriber.captionsDelegate = self

	do {
		try self.session?.subscribe(subscriber)
	} catch let error {
		print("Error subscribing: \(error)")
	}

	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:

func subscriberDidConnect(toStream subscriberKit: OTSubscriberKit) {
	if subscriber.stream.streamId == selfPublisherStreamId {
    	return // Don't show the self subscriber view.
	}

	// Show other subscribers in the UI
	if let subsView = subscriber?.view {
		subsView.frame = CGRect(x: 0, y: kWidgetHeight, width: kWidgetWidth, height: kWidgetHeight)
		view.addSubview(subsView)
	}
}

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

func onSubscriberCaptionText(_ subscriber: OpaquePointer!, caption_text: String!) {
	// Adjust UI to show captions.
	DispatchQueue.main.async {
		if let s = self.views[subscriber] {
			s.updateCaptionText(caption_text)
		}
	}
}