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 hay que crear una sala SID mientras que en Vonage se crea un ID de sesión. A continuación, se crean tokens de autenticación que se utilizan en el lado del cliente para conectarse a salas en Twilio o a sesiones en Vonage.

Los siguientes diagramas detallan las principales diferencias:

Vonage Twilio migraiton illustration 1

Vonage Twilio migraiton illustration 1

Obtener las credenciales del SDK de vídeo

Crear un desarrollador Account para acceder al portal de desarrolladores. Para empezar a trabajar con vídeo, debes crear una aplicación. Puedes seguir las crear una aplicación guía para obtener su ID de la solicitud y clave privada.

Instalar el SDK

Sustituye la referencia al SDK de vídeo de Twilio en tu archivo Gradle (build.gradle) por la del 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 has hecho, activa el siguiente permiso en el 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 vídeo de Vonage utiliza tokens para autenticar a los usuarios. Al generar un token, puedes establecer el rol del usuario (suscriptor, editor o moderador). Si lo deseas, también puedes asignar una cadena de metadatos al token (es decir, para identificar al cliente conectado). Consulte nuestra 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 lado del 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, utiliza una de nuestras 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 Panel de control y se introduce de forma fija en la aplicación durante el desarrollo; sin embargo, en un entorno de producción, utiliza los SDK del servidor para proporcionar el ID de sesión y el token (consulta 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 las transmisiones de vídeo se realizan mediante un gestor 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

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

Esto equivale a la función de Twilio Room.Listener gestor 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

El 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

El 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 También es necesario indicar la transmisión a la que te gustaría unirte.

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

Publicación de vídeos

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 editorial

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

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

Activar el sonido del vídeo del editor de UnMute

Twilio:

localVideoTrack.enable(true);

Vonage:

mPublisher.setPublishVideo(true);

Suscríbete a un canal

Cuando un participante remoto (abonado) se conecta a una sesión, el Session.SessionListener.onStreamReceived() Se invoca la función de devolución de llamada 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);
   }

Desconectarse de una sesión

Twilio:

room.disconnect()

Vonage:

mSession.disconnect()

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

Lo ideal sería 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