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:


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
- Muestra Gradle archivo.
- Ejemplos de Applications en Aplicaciones de ejemplo para Android.
- Buenas prácticas para crear aplicaciones de vídeo.
- SDK de Android para la Video API de Vonage
- SDK del lado del servidor