Inscrição em streams — iOS (Swift)

Depois de conectado a uma sessão, você pode se inscrever em transmissões na sessão. Ao se inscrever em uma transmissão, você pode exibir o vídeo dela no aplicativo.

Este tópico inclui as seguintes seções:

Reconexão automática

Se um cliente perder a conexão com um fluxo assinado (por exemplo, devido a uma queda na conectividade de rede em qualquer um dos clientes), ele tentará se reconectar automaticamente ao fluxo. Quando a conexão com o fluxo é interrompida e o cliente tenta se reconectar, o OTSubscriberDelegate subscriberDidDisconnect(fromStream:) A mensagem é enviada ao delegado do objeto OTSubscriber. Quando a conexão é restabelecida, o OTSubscriberDelegate subscriberDidReconnect(toStream:) a mensagem é enviada. Se o cliente não conseguir restabelecer a conexão, o OTSessionDelegate session(_:streamDestroyed:) A mensagem é enviada.

Em resposta a esses eventos, seu aplicativo pode (opcionalmente) exibir notificações na interface do usuário indicando os estados de desconexão temporária, reconexão e desconexão.

// 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.
}

Detecção de fluxos em uma sessão

O OTSessionDelegate session(_ session:streamCreated:) A mensagem é enviada quando um novo fluxo é criado em uma sessão. (Um fluxo é criado quando um cliente publica um fluxo para a sessão.) O Objeto OTStream possui propriedades que definem o fluxo. Compare o connection propriedade do objeto OTStream com o connection propriedade do objeto OTSession para determinar se o fluxo é aquele publicado pelo seu 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.
    }
}

Você pode se inscrever em um stream para exibi-lo no seu aplicativo. Consulte a próxima seção.

Inscrever-se em um canal

Para se inscrever em um stream, chame a função OTSubscriber init(stream:delegate:) método, passando um objeto OTStream e um objeto delegado para receber mensagens relacionadas aos assinantes. Em seguida, chame oOTSession subscribe(_:error:) método para começar a assinar o feed:

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)")
    }
}

O OTSubscriberDelegate subscriberDidConnect(toStream:) A mensagem é enviada quando o aplicativo começa a receber o fluxo do assinante. Nesse momento, você pode adicionar a visualização do assinante (representada pelo OTSubscriber view propriedade) ao aplicativo:

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

Cancelar a inscrição em um stream

Para interromper a reprodução de uma transmissão da qual você é assinante, chame a função OTSession unsubscribe(_:error:) método:

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

O assinante foi desconectado. Em seguida, remova sua visualização da supervisualização:

subscriber.view?.removeFromSuperview()

Detectar quando os fluxos saem de uma sessão

Quando os streams saem de uma sessão, o OTSession session(_:streamDestroyed:) A mensagem é enviada. Quando um stream é descartado, a visualização de qualquer objeto OTSubscriber associado a esse stream é removida de sua superview. Verifique se o stream não foi publicado pelo seu próprio cliente e remova sua visualização da superview.

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

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

Detectar quando o vídeo de um assinante está desativado

O representante do assinante envia o OTSubscriberDelegate subscriberVideoDisabled(_:reason:) mensagem exibida quando o vídeo do assinante está desativado:

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

O reason O parâmetro pode ser definido como uma das seguintes constantes definidas na enumeração OTSubscriberVideoEventReason:

  • OTSubscriberVideoEventPublisherPropertyChanged — O problema com o vídeo ocorreu porque o autor da transmissão interrompeu a transmissão.
  • OTSubscriberVideoEventQualityChanged — O problema no vídeo foi causado por uma alteração na qualidade do fluxo de vídeo. A qualidade do fluxo pode variar devido às condições da rede ou ao uso da CPU, tanto no lado do assinante quanto no do emissor. Esse motivo é utilizado apenas em sessões cujo modo de mídia esteja definido como “roteado”. (Consulte O OpenTok Media Router e os modos de mídia.) Esse recurso do OpenTok Media Router faz com que o assinante interrompa a transmissão de vídeo quando a qualidade do sinal se deteriora, e a mensagem é enviada. Quando as condições melhoram, a transmissão de vídeo é retomada, e o OTSubscriberDelegate subscriberVideoEnabled(_:reason:) A mensagem é enviada. Quando o fluxo de vídeo é interrompido, o assinante continua recebendo o fluxo de áudio, caso haja um.
  • OTSubscriberVideoEventSubscriberPropertyChanged — O problema com o vídeo foi causado por uma alteração na conta deste assinante OTSubscriber subscribeToVideo propriedade.

Se a transmissão de vídeo for retomada, o OTSubscriberDelegate subscriberVideoEnabled(_:reason:) A mensagem é enviada.

Ao publicar um stream, você ativa ou desativa o recurso de fallback de áudio para emissores e assinantes. O recurso de fallback de áudio desativa o vídeo (tanto nos emissores quanto nos assinantes) quando as condições da rede ou da CPU não permitem a exibição de vídeo. Consulte Opção alternativa de áudio (Web).

Obter informações sobre um fluxo

O objeto OTStream possui as seguintes propriedades que definem o fluxo:

  • connection—O objeto OTConnection correspondente à conexão que está publicando o fluxo. Você pode comparar isso com o connection propriedade do objeto OTSession para verificar se o fluxo está sendo publicado pelo seu cliente.
  • creationTime—O carimbo de data e hora correspondente à data de criação do stream.
  • hasAudio—(Bool) Se o stream possui áudio.
  • hasVideo—(Bool) Se a transmissão contém vídeo.
  • name—(String?) O nome do fluxo. Esse valor é definido ao inicializar o Publisher do fluxo (consulte Inicializando um objeto OTPublisher).
  • session—(OTSession) A sessão do OpenTok à qual a transmissão está vinculada.
  • streamId—(String) O ID exclusivo do fluxo.
  • videoDimensions—Um objeto CGSize que define as dimensões atuais da trilha de mídia de vídeo neste fluxo.
  • videoType—(OTStreamVideoType) Se a transmissão utiliza uma fonte de vídeo de câmera (OTStreamVideoTypeCamera), uma fonte de vídeo para compartilhamento de tela (OTStreamVideoTypeScreen), ou uma fonte de vídeo personalizada (OTStreamVideoTypeCustom). Veja Compartilhamento de tela.

Você pode definir um OTSubscriberKitNetworkStatsDelegate objeto para que o objeto OTSubscriberKit monitore as estatísticas do fluxo de um assinante.

Consulte Guia do desenvolvedor sobre observabilidade do cliente para obter informações detalhadas.

Como definir a taxa de quadros e a resolução preferidas

Ao assinar um stream que utiliza o recurso de vídeo escalável, é possível definir a taxa de quadros e a resolução preferidas para a transmissão que o cliente assinante recebe do OpenTok Media Router. Para mais detalhes, consulte SubscriberKit.preferredFrameRate e SubscriberKit.preferredResolution.

Observação: Essas preferências pressupõem que o editor esteja utilizando o layout padrão da camada de escalabilidade. Se o editor tiver definido um modo de escalabilidade de destino diferente do padrão (consulte Definição do modo de escalabilidade alvo), a seleção de camada do Media Router pode não corresponder à resolução ou à taxa de quadros solicitada. Consulte Interação com a resolução e a taxa de quadros preferidas pelo assinante para mais detalhes.