Suscribirse a flujos — iOS (Swift)

Una vez que haya conectado a una sesión, puedes suscribirte a las transmisiones de la sesión. Cuando te suscribes a una transmisión, puedes mostrar su vídeo en la aplicación.

Este tema incluye las siguientes secciones:

Reconexión automática

Si un cliente pierde la conexión con un flujo al que está suscrito (por ejemplo, debido a una interrupción de la conectividad de red en cualquiera de los clientes), intentará volver a conectarse automáticamente al flujo. Cuando se interrumpe el flujo y el cliente intenta volver a conectarse, el OTSubscriberDelegate subscriberDidDisconnect(fromStream:) Se envía un mensaje al delegado del objeto OTSubscriber. Cuando se restablece la conexión, el OTSubscriberDelegate subscriberDidReconnect(toStream:) Se envía el mensaje. Si el cliente no puede restablecer la conexión, el OTSessionDelegate session(_:streamDestroyed:) se envía el mensaje.

En respuesta a estos eventos, tu aplicación puede (opcionalmente) mostrar notificaciones en la interfaz de usuario indicando los estados de desconexión temporal, reconexión y desconexión.

// OTSubscriber delegate callbacks:
func subscriberDidDisconnect(fromStream subscriber: OTSubscriberKit) {
  // Display a user interface notification.
}

func subscriberDidReconnect(toStream subscriber: OTSubscriberKit) {
  // Adjust user interface.
}

// OTSession delegate callback:
func session(_ session: OTSession, streamDestroyed stream: OTStream) {
  // Adjust user interface.
}

Detección de flujos en una sesión

El OTSessionDelegate session(_ session:streamCreated:) Se envía un mensaje cuando se crea un nuevo flujo en una sesión. (Se crea un flujo cuando un cliente publica a la sesión). El sitio Objeto OTStream tiene propiedades que definen el flujo. Compara el connection propiedad del objeto OTStream con el connection propiedad del objeto OTSession para determinar si el flujo es uno de los que ha publicado tu cliente:

func session(_ session: OTSession, streamCreated stream: OTStream) {
    print("Session streamCreated: \(stream.streamId)")

    // See the declaration of subscribeToSelf above.
    if stream.connection.connectionId == session.connection.connectionId {
        // This is my own stream
    } else {
        // This is a stream from another client.
    }
}

Puedes suscribirte a una transmisión para mostrarla en tu aplicación. Consulta la siguiente sección.

Suscribirse a una transmisión

Para suscribirte a un flujo, llama a la función OTSubscriber init(stream:delegate:) método, pasando un objeto OTStream y un objeto delegado para recibir mensajes relacionados con los suscriptores. A continuación, llama alOTSession subscribe(_:error:) Método para empezar a suscribirse a la transmisión:

func session(_ session: OTSession, streamCreated stream: OTStream) {
    subscriber = OTSubscriber(stream: stream, delegate: self)
    var error: OTError?
	session.subscribe(subscriber!, error: &error)
	
    if error {
      print("subscribe failed with error: \(error)")
    }
}

El OTSubscriberDelegate subscriberDidConnect(toStream:) se envía cuando la aplicación empieza a recibir el flujo del abonado. En este punto, puedes añadir la vista del suscriptor (representada por el icono OTSubscriber view propiedad) a la aplicación:

func subscriberDidConnect(toStream subscriber: OTSubscriberKit) {
	if let subscriberView = self.subscriber?.view {
		subscriberView.frame = CGRect(x: 0, y: 300, width: 400, height: 300)
		self.view.addSubview(subscriberView)
	}
}

Darse de baja de un canal

Para dejar de reproducir una transmisión a la que estás suscrito, llama a la OTSession unsubscribe(_:error:) método:

var error: OTError?
session.unsubscribe(subscriber, error: &error)
if (error) {
    print("unsubscribe failed with error: \(error)")
}

El suscriptor se ha desconectado. A continuación, elimina su vista de su supervista:

subscriber.view?.removeFromSuperview()

Detectar cuándo los flujos abandonan una sesión

Cuando los flujos abandonan una sesión, el OTSession session(_:streamDestroyed:) Se envía el mensaje. Cuando se elimina un flujo, la vista de cualquier objeto `OTSubscriber` asociado a dicho flujo se elimina de su vista principal. Comprueba si el flujo no ha sido publicado por tu propio cliente y, en ese caso, elimina su vista de la vista principal.

func session(_ session: OTSession, streamDestroyed stream: OTStream) {
    print("Session streamDestroyed: \(stream.streamId)")

    if subscriber?.stream?.streamId == stream.streamId {
        subscriber?.view?.removeFromSuperview()
        subscriber = nil
    }
}

Detectar cuándo se desactiva el vídeo de un suscriptor

El representante del suscriptor envía el OTSubscriberDelegate subscriberVideoDisabled(_:reason:) Mensaje que aparece cuando el vídeo del suscriptor está desactivado:

func subscriberVideoDisabled(_ subscriber: OTSubscriberKit, reason: OTSubscriberVideoEventReason) {
    print("subscriber video disabled.")
}

El reason El parámetro se puede establecer en una de las siguientes constantes definidas en la enumeración OTSubscriberVideoEventReason:

  • OTSubscriberVideoEventPublisherPropertyChanged - El evento de vídeo fue causado por el editor de la secuencia de detener el flujo de vídeo.
  • OTSubscriberVideoEventQualityChanged - El evento de vídeo ha sido causado por un cambio en la calidad del flujo de vídeo. La calidad del flujo puede cambiar debido a las condiciones de la red o al uso de la CPU por parte del suscriptor o del editor. Esta razón sólo se utiliza en sesiones que tienen el modo de medios configurado como "enrutado". (Véase El OpenTok Media Router y los modos multimedia.) Esta función del OpenTok Media Router hace que el suscriptor interrumpa la transmisión de vídeo cuando la calidad de la misma se deteriora y se envía el mensaje. Cuando las condiciones mejoran, la transmisión de vídeo se reanuda, y el OTSubscriberDelegate subscriberVideoEnabled(_:reason:) se envía el mensaje. Cuando se interrumpe el flujo de vídeo, el abonado sigue recibiendo el flujo de audio, si lo hay.
  • OTSubscriberVideoEventSubscriberPropertyChanged - El evento de vídeo ha sido causado por un cambio en el abonado OTSubscriber subscribeToVideo propiedad.

Si el flujo de vídeo se reanuda, el OTSubscriberDelegate subscriberVideoEnabled(_:reason:) se envía el mensaje.

Al publicar una transmisión, puedes activar o desactivar la función de recambio de audio para emisores y suscriptores. La función de recambio de audio desactiva el vídeo (tanto en los emisores como en los suscriptores) cuando las condiciones de la red o de la CPU no permiten la reproducción de vídeo. Consulta Opción alternativa de audio (Web).

Obtener información sobre un flujo

El objeto OTStream tiene las siguientes propiedades que definen el flujo:

  • connection-El objeto OTConnection correspondiente a la conexión que está publicando el flujo. Puede compararlo con el objeto connection del objeto OTSession para ver si el flujo está siendo publicado por su cliente.
  • creationTime—La marca de tiempo «Date» correspondiente a la fecha de creación del flujo.
  • hasAudio-(Bool) Si el flujo tiene audio.
  • hasVideo-(Bool) Si el flujo tiene vídeo.
  • name-(¿Cadena?) El nombre del flujo. Se define al inicializar el editor del flujo (véase Inicialización de un objeto OTPublisher).
  • session—(OTSession) La sesión de OpenTok a la que está vinculada la transmisión.
  • streamId—(Cadena) El identificador único de la transmisión.
  • videoDimensions-Un objeto CGSize que define las dimensiones actuales de la pista multimedia de vídeo en este flujo.
  • videoType-(OTStreamVideoType) Si el flujo utiliza una fuente de vídeo de cámara (OTStreamVideoTypeCamera), una fuente de vídeo de pantalla compartida (OTStreamVideoTypeScreen), o una fuente de vídeo personalizada (OTStreamVideoTypeCustom). Véase Compartir pantalla.

Puedes configurar un OTSubscriberKitNetworkStatsDelegate objeto que permite al objeto OTSubscriberKit supervisar las estadísticas de la transmisión de un suscriptor.

Consulte guía del desarrollador de la observabilidad del cliente para obtener información detallada.

Ajuste de la frecuencia de imagen y la resolución preferidas

Al suscribirse a una transmisión que utiliza el función de vídeo escalable, puedes configurar la frecuencia de fotogramas y la resolución que prefieras para la transmisión que el cliente suscrito recibe del OpenTok Media Router. Para obtener más información, consulta SubscriberKit.preferredFrameRate y SubscriberKit.preferredResolution.

Nota: Estas preferencias dan por hecho que el editor utiliza la disposición predeterminada de la capa de escalabilidad. Si el editor ha configurado un modo de escalabilidad de destino distinto del predeterminado (véase Configuración del modo de escalabilidad deseado), es posible que la selección de capa del Media Router no coincida con la resolución o la frecuencia de fotogramas solicitadas. Véase Interacción con la resolución y la frecuencia de fotogramas preferidas por el suscriptor Para más información.