Legendas em tempo real — SDK do Vonage Video para iOS (Swift)
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 = true
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 = true
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 false:
subscriber.setSubscribeToCaptions = false
O OTSubscriberKitCaptionsDelegate(_:subscriber:caption:isFinal:) A mensagem é enviada quando um
assinante de um stream recebe legendas:
// OTSubscriberKitDelegate callbacks:
func subscriber(_ subscriber: OTSubscriberKit, caption text: NSString, isFinal final: Bool) {
// Display caption text in UI.
}
Você pode configurar um observador de chave-valor para o hasCaptions propriedade de um objeto OTStream
para verificar quando as legendas do stream estão ativadas ou desativadas.
//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
}
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(delegate: self, settings: pubSettings!)
publisher?.publishCaptions = true
Inscreva-se na transmissão no 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
}
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:
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)
}
}
O assinante tem o texto transcrito (para sua transmissão publicada) no seguinte 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)
}
}
}