Legendas em tempo real — SDK do Vonage Video para Android

O SDK do OpenTok para Android inclui métodos para que os clientes Android 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 chamando a função setPublishCaptions() método do objeto PublisherKit:

publisher.setPublishCaptions(true);

Se a editora não incluir uma faixa de áudio, o PublisherKit.PublisherListener.onError() o método é chamado com um erro (com o code propriedade do conjunto de erros definida como PublisherMissingAudioTrack).

O SDK do Vonage para Android 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 ligando para o subscribeToCaptions() método do objeto SubscriberKit:

subscriber.setSubscribeToCaptions(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, passe false no método:

subscriber.setSubscribeToCaptions(false);

Os assinantes podem verificar se estão ativamente inscritos nas legendas ao vivo de uma transmissão usando o isSubscribedToCaptions() método:

boolean isSubscribed = subscriber.getSubscribeToCaptions();

Os assinantes recebem legendas por meio de eventos. O SDK do OpenTok não exibe o texto das legendas na interface do usuário. Use o SubscriberKit.CaptionsListener interface para configurar um ouvinte para eventos de legendas:

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

O hasCaptions() O método de um objeto Stream informa se o stream possui legendas:

boolean hasCaptions = stream.hasCaptions();

Implementar o onStreamHasCaptionsChanged() método do Session.StreamPropertiesListener interface para monitorar quando as legendas de uma transmissão estão ativadas ou desativadas:

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

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, chame setPublishCaptions() passando por true:

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

Inscreva-se no feed do editor onStreamCreated() função de retorno:

@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();
}

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:

@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());
	}
}

O assinante tem o texto transcrito (da sua transmissão publicada) no onCaptionText() ouvinte:

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