Guía de migración a Twilio (Android)

Esta guía te indica cómo migrar tu implementación existente de Twilio Video al SDK de video de Vonage. Vonage ofrece dos maneras de comenzar: El Video API.

Visión general

Las Video API de Twilio y Vonage tienen conceptos muy similares. Esta guía de inicio pretende ayudarte a migrar tu aplicación de vídeo.

La principal diferencia es que en Twilio es necesario crear una sala SID mientras que en Vonage se crea un Identificador de sesión. A continuación, crea tokens de autenticación que se utilizan en el lado del cliente para conectarse a salas en Twilio o sesiones en Vonage.

Los siguientes diagramas detallan las principales diferencias:

Vonage Twilio migraiton illustration 1 Vonage Twilio migraiton illustration 1

Obtener credenciales de Video SDK

Crear un desarrollador Account para acceder al portal de desarrolladores. Para empezar con el vídeo es necesario crear una aplicación. Puedes seguir el crear una aplicación guía para obtener su ID de aplicación y clave privada.

Instalar el SDK

Sustituye la referencia al SDK de vídeo de Twilio en tu archivo Gradle (build.gradle) por el SDK de vídeo de Vonage.

Así, desde implementation 'com.twilio:video-android:7.5.1' a implementation ‘com.opentok.android:opentok-android-sdk:2.27.0’.


Habilitar los permisos necesarios

Si aún no lo ha hecho, habilite el siguiente permiso en la carpeta AndroidManifest.xml archivo:

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

Autenticación

El SDK de Vonage Video utiliza tokens para autenticar a los usuarios. Al generar un token, puedes establecer el rol del usuario (suscriptor, editor o moderador). Opcionalmente, también puedes asignar una cadena de metadatos al token (es decir, para identificar al cliente conectado). Artículo sobre la creación de tokens para ver las opciones que puede utilizar al generar tokens. Los tokens se generan en el servidor y se envían al cliente. Visite la página Guías de SDK del lado del servidor para saber más.

Crear una sesión de vídeo

A sesión es como un habitaciónclientes con el mismo ID de sesión podrán comunicarse entre sí. Como fichas, sesiones se crean en el servidor.

Consulte nuestra Crear una sesión guía para obtener más información, así como las distintas opciones de configuración disponibles.

Para crear una sesión y generar un token, utilice uno de nuestros módulos SDK para servidores.

Conectarse a una sesión de vídeo

Para conectar un punto final de cliente a una sesión de Vonage Video necesitas un ID de aplicación, un ID de sesión y un token.

Estas credenciales pueden obtenerse en la página Cuadro de mandos y codificado en la aplicación para el desarrollo; sin embargo, para un entorno de producción, utilice los SDK del servidor para proporcionar el ID de sesión y el token (consulte Videochat básico proyecto).

Mapeo terminológico Twilio Vonage

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

Conectarse a una sesión de vídeo

La conexión y la gestión de los flujos de vídeo se realizan mediante un controlador de eventos.

Hay tres escuchadores de eventos clave que necesitas implementar:

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

SessionListener

En Session.SessionListener se utilizan para gestionar eventos que implican la adición y eliminación de participantes (suscriptores y editores).

Esto equivale a Room.Listener controlador de eventos.

A continuación se muestra la estructura de lo expuesto SessionListener interfaz:

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

En PublisherKit.PublisherListener se utiliza para implementar la lógica a ejecutar basada en los flujos de creación y fin.

A continuación se muestra la estructura de lo expuesto PublisherListener interfaz:

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

En SubscriberKit.SubscriberListener se utiliza para implementar la lógica a ejecutar cuando un suscriptor se une a un flujo.

A continuación se muestra la estructura de lo expuesto SubscriberListener interfaz:

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

Conectarse a una sesión

Necesitará su APP_ID , ID_SESIÓN para conectarse a un flujo de vídeo.

A TOKEN correspondiente al flujo al que desea unirse.

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);

Publicar vídeo

Los SDK de video de Vonage manejan el ajuste de calidad de video automáticamente, según las condiciones de la red y las capacidades del dispositivo.

Dicho esto, puede configurar ciertas propiedades, como resolución, frecuencia de imageny fallback de audio. Un único objeto editor puede manejar tanto audio como vídeo. Puede controlar selectivamente el audio o el vídeo utilizando métodos disponibles con el objeto editor.

Añadir editor

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

Sólo pista de audio

Twilio

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

Vonage:

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

Sólo pista de vídeo

Twilio:

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

Vonage:

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

Anular la publicación de la sesión

Twilio:

localParticipant.unpublishTrack(localVideoTrack);

Vonage:

mSession.unpublish(mPublisher);

Silenciar el audio del editor

Twilio:

localAudioTrack.enable(false);

Vonage:

mPublisher.setPublishAudio(false);

UnMute Publisher Audio

Twilio:

localAudioTrack.enable(true);

Vonage:

mPublisher.setPublishAudio(true);

Silenciar el vídeo del editor

Twilio:

localVideoTrack.enable(false);

Vonage:

mPublisher.setPublishVideo(false);

UnMute Publisher Video

Twilio:

localVideoTrack.enable(true);

Vonage:

mPublisher.setPublishVideo(true);

Suscribirse a un flujo

Cuando un participante remoto (abonado) se conecta a una sesión, el Session.SessionListener.onStreamReceived() con el objeto de flujo correspondiente.

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

Desconexión de una sesión

Twilio:

room.disconnect()

Vonage:

mSession.disconnect()

métodos onPause() y 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() y onResume() debe aplicarse en el MainActivity Clase.

Compartir pantalla

Una aplicación de ejemplo para compartir pantalla.

Aplicación de chat de texto

Una aplicación de ejemplo para envío de texto.

Más información