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