Guia de migração do Twilio (Android)

Este guia explica como migrar sua implementação atual do Twilio Video para o SDK do Vonage Video. A Vonage oferece duas maneiras de começar: a Vonage’s Video API.

Visão geral

As Video APIs do Twilio e do Vonage têm conceitos muito semelhantes. Este guia introdutório tem como objetivo ajudá-lo a migrar seu aplicativo de vídeo.

A principal diferença é que, no Twilio, é preciso criar uma sala SID considerando que, no Vonage, você cria um ID da sessão. Em seguida, você cria tokens de autenticação que são usados no lado do cliente para se conectar a salas no Twilio ou a sessões no Vonage.

Os diagramas a seguir detalham as principais diferenças:

Vonage Twilio migraiton illustration 1

Vonage Twilio migraiton illustration 1

Obter credenciais do Video SDK

Criar um Account de desenvolvedor para acessar o portal do desenvolvedor. Para começar a trabalhar com vídeo, você precisa criar um aplicativo. Você pode seguir as criar um aplicativo guia para obter seu ID do aplicativo e chave privada.

Instale o SDK

Substitua a referência ao SDK de vídeo do Twilio no seu arquivo Gradle (build.gradle) pelo SDK de vídeo da Vonage.

Assim, a partir de implementation 'com.twilio:video-android:7.5.1' para implementation ‘com.opentok.android:opentok-android-sdk:2.27.0’.


Ativar as permissões necessárias

Caso ainda não tenha feito isso, habilite a seguinte permissão no AndroidManifest.xml arquivo:

...
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />


<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
</manifest>

Autenticação

O SDK de vídeo da Vonage utiliza tokens para autenticar usuários. Ao gerar um token, é possível definir a função do usuário (assinante, editor ou moderador). Opcionalmente, também é possível atribuir uma sequência de metadados ao token (ou seja, para identificar o cliente conectado). Consulte nosso Artigo: Visão geral da criação de tokens para conhecer as opções que você pode usar ao gerar tokens. Os tokens são gerados no lado do servidor e enviados para o lado do cliente. Acesse o Guias dos SDKs do lado do servidor para saber mais.

Criar uma sessão de vídeo

A sessão é como um sala, clientes com o mesmo ID da sessão poderão se comunicar entre si. Como fichas, sessões são criados no lado do servidor.

Consulte nosso Criação de uma sessão guia para saber mais e conhecer as diversas opções de configuração disponíveis.

Para criar uma sessão e gerar um token, use uma de nossas SDKs de servidor.

Conectar-se a uma sessão de vídeo

Para conectar um endpoint de cliente a uma sessão do Vonage Video, é necessário um ID de aplicativo, um ID de sessão e um token.

Essas credenciais podem ser obtidas no Painel de controle e codificado diretamente no aplicativo para fins de desenvolvimento; no entanto, em um ambiente de produção, utilize os SDKs do servidor para fornecer o ID da sessão e o token (consulte Bate-papo por vídeo básico projeto).

Mapeamento de terminologia entre Twilio e Vonage

Twilio Vonage
Room Session
Participants Subscriber(s) + Publisher(s)
Tracks Stream
RemoteTracks Subscribers(s).stream
LocalTracks Publisher(s).stream

Conectando-se a uma sessão de vídeo

A conexão e o gerenciamento de fluxos de vídeo são realizados por meio de um manipulador de eventos.

Existem três ouvintes de eventos principais que você precisa implementar:

  • Session.SessionListener (private Session mSession;)
  • PublisherKit.PublisherListener (private Publisher mPublisher;)
  • SubscriberKit.SubscriberListener (private Subscriber mSubscriber;)

SessionListener

O Session.SessionListener Esses métodos são utilizados para lidar com eventos relacionados à adição e remoção de participantes (assinantes e editores).

Isso equivale ao da Twilio Room.Listener manipulador de eventos.

A seguir, está a estrutura do exposto SessionListener interface:

private Session.SessionListener sessionListener = new Session.SessionListener() {
   @Override
   public void onConnected(Session session) {
       Log.d(TAG, "onConnected: Connected to session: " + session.getSessionId());


       mPublisher = new Publisher.Builder(MainActivity.this).build();
       mPublisher.setPublisherListener(publisherListener);
       mSession.publish(mPublisher);
   }


   @Override
   public void onDisconnected(Session session) {
       Log.d(TAG, "onDisconnected: Disconnected from session: " + session.getSessionId());
   }


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


       mSubscriber = new Subscriber.Builder(MainActivity.this, stream).build();
       mSubscriber.setSubscriberListener(subscriberListener);
       mSession.subscribe(mSubscriber);
   }


   @Override
   public void onStreamDropped(Session session, Stream stream) {
       Log.d(TAG, "onStreamDropped: Stream Dropped: " + stream.getStreamId() + " in session: " + session.getSessionId());   
   }


   @Override
   public void onError(Session session, OpentokError opentokError) {
       Log.e("Session error: " + opentokError.getMessage());
   }
};

PublisherListener

O PublisherKit.PublisherListener é usado para implementar a lógica a ser executada com base nos fluxos de criação e de encerramento.

A seguir, está a estrutura do exposto PublisherListener interface:

private PublisherKit.PublisherListener publisherListener = new PublisherKit.PublisherListener() {
   @Override
   public void onStreamCreated(PublisherKit publisherKit, Stream stream) {
       Log.d(TAG, "onStreamCreated: Publisher Stream Created. Own stream " + stream.getStreamId());
   }


   @Override
   public void onStreamDestroyed(PublisherKit publisherKit, Stream stream) {
       Log.d(TAG, "onStreamDestroyed: Publisher Stream Destroyed. Own stream " + stream.getStreamId());
   }


   @Override
   public void onError(PublisherKit publisherKit, OpentokError opentokError) {
       Log.e("PublisherKit onError: " + opentokError.getMessage());
   }
};

SubscriberListener

O SubscriberKit.SubscriberListener é usado para implementar a lógica a ser executada quando um assinante entra em um fluxo.

A seguir, está a estrutura do exposto SubscriberListener interface:

SubscriberKit.SubscriberListener subscriberListener = new SubscriberKit.SubscriberListener() {
   @Override
   public void onConnected(SubscriberKit subscriberKit) {
       Log.d(TAG, "onConnected: Subscriber connected. Stream: " + subscriberKit.getStream().getStreamId());
   }


   @Override
   public void onDisconnected(SubscriberKit subscriberKit) {
       Log.d(TAG, "onDisconnected: Subscriber disconnected. Stream: " + subscriberKit.getStream().getStreamId());
   }


   @Override
   public void onError(SubscriberKit subscriberKit, OpentokError opentokError) {
       Log.e("SubscriberKit onError: " + opentokError.getMessage());
   }
};

Conectando-se a uma sessão

Você vai precisar do seu APP_ID , SESSION_ID para se conectar a uma transmissão de vídeo.

A TOKEN Também é necessário indicar a transmissão à qual você deseja participar.

Twilio

private Room room;
ConnectOptions.Builder connectOptionsBuilder =
       new ConnectOptions.Builder(accessToken).roomName(roomName);
room = Video.connect(this, connectOptionsBuilder.build(), roomListener());

Vonage

Session.Builder builder = new Session.Builder(this, APP_ID, SESSION_ID);
mSession = builder.build();
mSession.setSessionListener(sessionListener);
mSession.connect(TOKEN);

Publicação de vídeo

Os SDKs de vídeo da Vonage ajustam automaticamente a qualidade do vídeo, com base nas condições da rede e nas capacidades do dispositivo.

Dito isso, você pode configurar certas propriedades, como resolução, taxa de quadros, e opção alternativa de áudio. Um único objeto publisher pode lidar tanto com áudio quanto com vídeo. É possível controlar seletivamente o áudio ou o vídeo usando os métodos disponíveis no objeto publisher.

Adicionar editora

Twilio:

localVideoTrack = LocalVideoTrack.create(this, true, cameraCapturerCompat, LOCAL_VIDEO_TRACK_NAME);

Vonage:

Session.SessionListener() {
   @Override
   public void onConnected(Session session) {
       Log.d(TAG, "onConnected: Connected to session: " + session.getSessionId());
       mPublisher = new Publisher.Builder(MainActivity.this).build();
       mPublisher.setPublisherListener(publisherListener);
       mSession.publish(mPublisher);
   }
}

Apenas trilha de áudio

Twilio

localVideoTrack =
       LocalVideoTrack.create(this, false, cameraCapturerCompat, LOCAL_VIDEO_TRACK_NAME);

Vonage:

mPublisher = new Publisher.Builder(this).name(mUsername)
       .videoTrack(false)
       .build();

Apenas a faixa de vídeo

Twilio:

localAudioTrack = LocalAudioTrack.create(this, false, LOCAL_AUDIO_TRACK_NAME);

Vonage:

mPublisher = new Publisher.Builder(this).name(mUsername)
       .audioTrack(false)
       .build();

Retirar da publicação da sessão

Twilio:

localParticipant.unpublishTrack(localVideoTrack);

Vonage:

mSession.unpublish(mPublisher);

Silenciar o áudio do Publisher

Twilio:

localAudioTrack.enable(false);

Vonage:

mPublisher.setPublishAudio(false);

Ativar o áudio do Publisher

Twilio:

localAudioTrack.enable(true);

Vonage:

mPublisher.setPublishAudio(true);

Silenciar o vídeo do editor

Twilio:

localVideoTrack.enable(false);

Vonage:

mPublisher.setPublishVideo(false);

Ativar o som do vídeo do editor

Twilio:

localVideoTrack.enable(true);

Vonage:

mPublisher.setPublishVideo(true);

Inscreva-se em um canal

Quando um participante remoto (assinante) se conecta a uma sessão, o Session.SessionListener.onStreamReceived() A função de retorno de chamada é invocada com o objeto de fluxo correspondente.

Twilio:

@Override
public void onConnected(Room room) {
   localParticipant = room.getLocalParticipant();
   setTitle(room.getName());


   for (RemoteParticipant remoteParticipant : room.getRemoteParticipants()) {
       addRemoteParticipant(remoteParticipant);
       break;
   }
}

Vonage:

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


       mSubscriber = new Subscriber.Builder(MainActivity.this, stream).build();
       mSubscriber.setSubscriberListener(subscriberListener);
       mSession.subscribe(mSubscriber);
   }

Desconectando-se de uma sessão

Twilio:

room.disconnect()

Vonage:

mSession.disconnect()

Métodos onPause() e onResume()

Vonage:

@Override
protected void onPause() {
   super.onPause();


   if (mSession != null) {
       mSession.onPause();
   }
}


@Override
protected void onResume() {
   super.onResume();
   if (mSession != null) {
       mSession.onResume();
   }
}

Idealmente onPause() e onResume() deveria ser implementado no MainActivity Aula.

Compartilhamento de tela

Um aplicativo de exemplo para compartilhamento de tela.

Aplicativo de bate-papo por texto

Um aplicativo de exemplo para envio de mensagem de texto.

Mais informações