Guía de migración a Twilio (iOS)
Esta guía te guía a través de la migración de tu aplicación de video Twilio existente a Vonage Video.
Para obtener la máxima flexibilidad y versatilidad en la programación de su solución de vídeo, el SDK para iOS de la API de Video de Vonage te tiene cubierto.
Si tus requisitos van más allá de las simples funciones de video e incluyen funciones como transmisión, integración SIP, procesamiento de medios y configuraciones de transmisión personalizables, descubrirás que el SDK para iOS de Vonage Video ofrece una potencia y flexibilidad inigualables.
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.
Una diferencia clave entre la implementación de vídeo de Twilio y Vonage es el uso de sala SID, este es un ID de sesión cuando se trata de Vonage. Veremos cómo generar un identificador de sesión en una sección posterior.
También necesitará un testigo de autenticación cuando se conecta un cliente a una sesión activa.
El siguiente diagrama ilustra las diferencias arquitectónicas entre el vídeo de Twilio y Vonage.
Mapeo terminológico Twilio Vonage
| Twilio | Vonage |
|---|---|
| Room | Session |
| Participants | Subscriber(s) + Publisher(s) |
| Tracks | Stream |
| RemoteTracks | Subscribers(s).stream |
| LocalTracks | Publisher(s).stream |
Obtener credenciales de Video SDK
Crear un desarrollador Account para acceder al portal de desarrolladores.
Para empezar con el vídeo necesitas crear una aplicación. Puede seguir el crear una aplicación guía para obtener su ID de aplicación y clave privada.
Instalar el SDK
Puedes instalar el SDK de Vonage Video para iOS a través de la aplicación Gestor de paquetes Swift o Cocoapods:
Uso del gestor de paquetes Swift
Para añadir una dependencia de paquete a su proyecto Xcode, seleccione Archivo > Paquetes Swift > Añadir dependencia de paquete e introduzca la URL del repositorio:
Uso de Cocoapods
Cuando añada el SDK usando CocoaPods edite el Podfile y añada la siguiente línea:
Guarde los cambios en el Podfile, abra el directorio raíz del proyecto en el terminal/línea de comandos y ejecútelo:
Esto debería extraer el SDK de vídeo de Vonage y sus dependencias.
Ahora puede añadir el SDK a su controlador de vista.
En Xcode, abra su ViewController.swift y, en la parte superior del archivo, añada las siguientes líneas para importar la videoteca:
import UIKit
import OpenTok
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).
Consulte nuestra Guía de creación de fichas para aprender a generar tokens. Los tokens se generan en el servidor y se utilizan en el 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ón. Todos los clientes que utilicen el mismo ID de sesión podrán comunicarse entre sí.
Como fichas, sesiones se crean en el servidor. Consulte nuestro Creación de una guía de sesión para saber más.
Para crear una sesión y generar un token, utilice uno de nuestros módulos SDK para servidores.
Puedes declarar todas tus claves como propiedades en tu ViewController.swift archivo:
// Replace with your Application ID
var kApplicationId = ""
// Replace with your generated session ID
var kSessionId = ""
// Replace with your generated token
var kToken = ""
Conectarse a una sesión de vídeo
Una vez configuradas todas las teclas, ya puedes conectarte a una sesión de vídeo activa.
Debe hacer esto antes de poder publicar su flujo de audio-vídeo en la sesión o ver los flujos de otros participantes.
Twilio
let twimlParamTo = "to"
let connectOptions: TVOConnectOptions = TVOConnectOptions(accessToken: accessToken) { (builder) in
builder.params = [twimlParamTo : “{to}”]
}
TwilioVoice.connect(with: connectOptions, delegate: self)
Vonage
class ViewController: UIViewController
var session: OTSession?
override func viewDidLoad() {
super.viewDidLoad()
connectToAnOpenTokSession()
}
func connectToAnOpenTokSession() {
// Important: Please note that your Application ID is your API key.
session = OTSession(apiKey: kApplicationId, sessionId: kSessionId, delegate: self)
var error: OTError?
session?.connect(withToken: kToken, error: &error)
if error != nil {
print(error!)
}
}
Receptores de eventos
Vonage y Twilio tienen protocolos de delegado para ayudarte a mantener el estado de una sesión/llamada para todos los participantes conectados a una sesión.
Cambios en la conexión sesión/sala
Twilio
// MARK: TVOCallDelegate
func callDidStartRinging(_ call: TVOCall) {
NSLog("callDidStartRinging:")
}
func callDidConnect(_ call: TVOCall) {
NSLog("callDidConnect:")
}
func call(_ call: TVOCall, isReconnectingWithError error: Error) {
NSLog("call:isReconnectingWithError:")
}
func callDidReconnect(_ call: TVOCall) {
NSLog("callDidReconnect:")
}
func call(_ call: TVOCall, didFailToConnectWithError error: Error) {
NSLog("Call failed to connect: \(error.localizedDescription)")
}
func call(_ call: TVOCall, didDisconnectWithError error: Error?) {
NSLog("Call disconnected")
}
Vonage
// MARK: - OTSessionDelegate callbacks
extension ViewController: OTSessionDelegate {
func sessionDidConnect(_ session: OTSession) {
print("The client connected to the Vonage Video API session.")
}
func sessionDidDisconnect(_ session: OTSession) {
print("The client disconnected from the Vonage Video API session.")
}
func session(_ session: OTSession, didFailWithError error: OTError) {
print("The client failed to connect to the Vonage Video API session: \(error).")
}
func session(_ session: OTSession, streamCreated stream: OTStream) {
print("A stream was created in the session.")
}
func session(_ session: OTSession, streamDestroyed stream: OTStream) {
print("A stream was destroyed in the session.")
}
}
Publicación de vídeos
Cuando un usuario está conectado a una sesión activa, puede publicar un flujo de audio-vídeo en la sesión, utilizando la cámara y el micrófono del dispositivo:
Esto se consigue añadiendo una propiedad publisher a la clase ViewController:
class ViewController: UIViewController, OTSessionDelegate {
var session: OTSession?
var publisher: OTPublisher?
Modificar la aplicación del OTSessionDelegate.sessionDidConnect(_:) para incluir código que publique un flujo en la sesión. He aquí un ejemplo:
func sessionDidConnect(_ session: OTSession) {
print("The client connected to the OpenTok session.")
let settings = OTPublisherSettings()
guard let publisher = OTPublisher(delegate: self, settings: settings) else {
Return
}
var error: OTError?
session.publish(publisher, error: &error)
guard error == nil else {
print(error!)
Return
}
guard let publisherView = publisher.view else {
Return
}
let screenBounds = UIScreen.main.bounds
publisherView.frame = CGRect(x: screenBounds.width - 150 - 20, y: screenBounds.height - 150 - 20, width: 150, height: 150)
view.addSubview(publisherView)
}
El SDK de Vonage Video maneja la calidad de video automáticamente, según las condiciones de la red y las capacidades del dispositivo. Dicho esto, puedes configurar ciertas propiedades, tales como resolución, frecuencia de imageny fallback de audio.
A continuación implementaremos los métodos del OTPublisherDelegate protocolo. Este protocolo incluye métodos para gestionar eventos relacionados con el editor.
Para ello, puede añadir el siguiente código a su archivo ViewController.swift archivo:
// MARK: - OTPublisherDelegate callbacks
extension ViewController: OTPublisherDelegate {
func publisher(_ publisher: OTPublisherKit, didFailWithError error: OTError) {
print("The publisher failed: \(error)")
}
}
Encender/apagar la cámara
El SDK de Vonage ofrece métodos simples para controlar la cámara.
Twilio
participant?.unpublishVideoTrack(cameraManager.track)
self.cameraManager = nil
Vonage
// This will only stop publishing Video to the session. You can still see your local preview
publisher.publishVideo = false
// This will only stop publishing all media (audio and video) to the session. You can still see your local preview
var error: OTError?
session.unpublish(publisher, error: &error)
guard error == nil else {
print(error!)
Return
}
Renderizar un vídeo de usuario remoto
Similar a Twilio participantDidConnect y didSubscribeToVideoTrack Vonage también activa connectionCreated y streamCreated cuando un participante remoto se conecta a la sesión y comienza a enviar vídeo.
Twilio
func participantDidConnect(room: Room, participant: RemoteParticipant) {
print ("Participant \(participant.identity) has joined Room \(room.name)")
// Set the delegate of the remote participant to receive callbacks
participant.delegate = self
}
func participantDidDisconnect(room: Room, participant: RemoteParticipant) {
print ("Participant \(participant.identity) has left Room \(room.name)")
}
func didSubscribeToVideoTrack(videoTrack: RemoteVideoTrack,
publication: RemoteVideoTrackPublication,
participant: RemoteParticipant) {
print("Participant \(participant.identity) added a video track.")
if let remoteView = VideoView.init(frame: self.view.bounds,
delegate:self) {
videoTrack.addRenderer(remoteView)
self.view.addSubview(remoteView)
self.remoteView = remoteView
}
}
Vonage
class ViewController: UIViewController {
var session: OTSession?
var publisher: OTPublisher?
var subscriber: OTSubscriber?
func session(_ session: OTSession, streamCreated stream: OTStream) {
subscriber = OTSubscriber(stream: stream, delegate: self)
guard let subscriber = subscriber else {
return
}
var error: OTError?
session.subscribe(subscriber, error: &error)
guard error == nil else {
print(error!)
return
}
guard let subscriberView = subscriber.view else {
return
}
subscriberView.frame = UIScreen.main.bounds
view.insertSubview(subscriberView, at: 0)
}
// MARK: - OTSubscriberDelegate callbacks
extension ViewController: OTSubscriberDelegate {
public func subscriberDidConnect(toStream subscriber: OTSubscriberKit) {
print("The subscriber did connect to the stream.")
}
public func subscriber(_ subscriber: OTSubscriberKit, didFailWithError error: OTError) {
print("The subscriber failed to connect to the stream.")
}
}
Audio
Vonage administra tanto el audio como el video utilizando un único objeto editor. Cuando comienzas a publicar con las opciones predeterminadas, el SDK publica tanto audio como video. Sin embargo, si prefieres tener una sesión de solo audio, puedes configurar el objeto editor para que no publique video.
Silenciar el micrófono
Con Twilio, debes obtener la pista de audio para silenciar el micrófono. Vonage simplifica esto al proporcionar un único método invocable.
Twilio
guard let micTrack = LocalAudioTrack(options: nil, enabled: true, name: TrackName.mic) else {
return
}
participant?.unpublishAudioTrack(micTrack)
Vonage
publisher.publishAudio = false
Desactivar micrófono
Del mismo modo, con Twilio Video, debes obtener la pista de audio para anular el silencio del micrófono. Vonage simplifica esto proporcionando un único método invocable.
Twilio
guard let micTrack = LocalAudioTrack(options: nil, enabled: true, name: TrackName.mic) else {
return
}
participant?.publishAudioTrack(micTrack)
Vonage
publisher.publishAudio = true
Chat de texto
Puede intercambiar datos (es decir, mensajes de chat de texto o mensajes JSON personalizados) entre participantes individuales de una sesión, así como entre todos los participantes de una sesión.
El siguiente método envía un mensaje a los clientes conectados a la sesión. Cada señal está definida por un tipo de cadena que identifica el tipo de mensaje (en este caso "chat") y una cadena que contiene el mensaje:
func sendChatMessage(message: String) {
var error: OTError?
session.signal(withType: "chat", string: message, connection: nil, error: &error)
if let error {
print(error)
}
}
Cuando otro cliente conectado a la sesión envía un mensaje, la implementación de una devolución de llamada de OTSessionDelegate le permite recibir el mensaje:
func session(_ session: OTSession, receivedSignalType type: String?, from connection: OTConnection?, with string: String?) {
print("Received signal type \(type) with message \(string)")
}
Abandonar y finalizar sesiones El siguiente código muestra cómo finalizar una sesión activa (desconectar a un usuario de una sesión).
Twilio
// To disconnect from a Room, we call:
room?.disconnect()
// This results in a callback to RoomDelegate#roomDidDisconnect(room: Room, error: Error?)
// MARK: RoomDelegate
func roomDidDisconnect(room: Room, error: Error?) {
print("Disconnected from room \(room.name)")
}
Vonage
var error: OTError?
session?.disconnect(&error)
if error != nil {
print(error!)
}
// MARK: OTSessionDelegate
func sessionDidDisconnect(_ session: OTSession) {
print("The client disconnected to the OpenTok session.")
}
Más información:
- SDK para iOS de la API de Video de Vonage
- Referencia del SDK de Vonage Video para iOS: Lista de todas las clases y métodos disponibles en el SDK de iOS
- Ejemplos de código (Objective C): Aplicaciones de ejemplo basadas en Objective C implementadas utilizando el SDK de Vonage para iOS.
- Ejemplos de código (Swift): Aplicaciones de muestra basadas en Swift implementadas utilizando el SDK de Vonage para iOS.
- Tutoriales sobre la creación de aplicaciones de vídeo con los SDK de Vonage