Inscreva-se: Gestão e Eventos

Este guia aborda o gerenciamento do comportamento dos assinantes e a resposta a eventos em tempo de execução.

Gerenciamento de fluxos de assinantes (React Native)

Como detectar quando as dimensões do vídeo de uma transmissão mudam

As dimensões do vídeo de uma transmissão podem mudar se uma transmissão publicada a partir de um dispositivo móvel for redimensionada (por exemplo, devido a mudanças na orientação do dispositivo) ou se a janela de origem do compartilhamento de tela for redimensionada.

Quando as dimensões do vídeo de uma transmissão mudam, o Session o objeto despacha um streamPropertyChanged evento, com changedProperty definir como videoDimensions.

<OTSubscriber
  eventHandlers={{
    streamVideoDimensionsChanged: (event) => {
      console.log('stream video dimensions changed -- stream ID:', event.streamId);
      console.log('new dimensions:', event.width, 'x', event.height);
    },
  }}
/>

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

Ao assinar um stream que utiliza o vídeo escalável com esse recurso, você pode definir preferredResolution para 'auto' para gerenciar automaticamente a resolução dos vídeos dos assinantes e otimizar o uso da CPU e da rede.

Para um controle avançado, defina a taxa de quadros e a resolução desejadas para o stream assinado:

<OTSubscriber
  properties={{
    preferredFrameRate: 15,
    preferredResolution: { width: 640, height: 480 },
  }}
/>

Essas são recomendações, não ordens. O Media Router seleciona a camada disponível mais próxima que se adapte às condições reais de rede do assinante. Elas não têm efeito em sessões retransmitidas, quando o vídeo escalável estiver desativado ou quando o codec negociado for o H.264. Para conhecer outras técnicas para reduzir o uso de recursos em sessões de grande porte, consulte o Guia de conexão com um único par.

Como detectar quando os fluxos saem de uma sessão

Quando um fluxo remoto sai de uma sessão, o OTSubscriber o componente envia um streamDestroyed evento. O evento inclui detalhes como streamId, name, reason, hasAudio, hasVideo, e videoType. Para obter todos os detalhes sobre o evento e seu reason valores, consulte o Inscreva-se no guia de diagnóstico.

<OTSubscriber
  eventHandlers={{
    streamDestroyed: (event) => {
      console.log('Stream stopped. Reason: ' + event.reason);
    },
  }}
/>

Exibição personalizada de assinantes

Por padrão, OTSubscriber renderiza as visualizações secundárias dos vídeos dos assinantes. Você também pode fornecer uma função de renderização para controlar totalmente a renderização usando renderView:

<OTSubscriber
  renderView={(streamId) => (
    <View style={styles.subscriberTile}>
      <OTSubscriberView streamId={streamId} style={styles.video} />
    </View>
  )}
/>

Definindo as propriedades do fluxo

Defina propriedades globais para todos os assinantes por meio do subscriberProperties apoiar OTSession, ou definir propriedades específicas para cada fluxo por meio do properties apoiar OTSubscriber. Para ver a lista completa dos imóveis disponíveis, consulte o Referência da API do OTSubscriber.

// Global defaults for all subscribers in the session
<OTSession
  subscriberProperties={{
    subscribeToAudio: true,
    subscribeToVideo: true,
  }}
/>

// Per-stream override
<OTSubscriber
  properties={{
    subscribeToAudio: true,
    subscribeToVideo: false,
  }}
/>

Gerenciamento de fluxos de assinantes (iOS Swift)

Gerencie assinantes, organize eventos e ajuste preferências no iOS.

Como detectar quando o vídeo de um assinante está desativado

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

Possíveis motivos

  • OTSubscriberVideoEventPublisherPropertyChanged
  • OTSubscriberVideoEventQualityChanged
  • OTSubscriberVideoEventSubscriberPropertyChanged

Quando o vídeo recomeçar:

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

Como obter informações sobre um fluxo

O OTStream O objeto inclui:

  • connection — A conexão editorial
  • creationTime — Data e hora
  • hasAudio — Bool
  • hasVideo — Bool
  • name — Nome opcional do fluxo
  • session — Sessão associada
  • streamId — ID exclusivo
  • videoDimensions — CGSize
  • videoType — Câmera, tela ou personalizada

Você pode acompanhar as estatísticas usando OTSubscriberKitNetworkStatsDelegate.

Veja o guia de observabilidade do cliente para mais detalhes.

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

Para transmissões de vídeo com resolução adaptável, você pode definir:

  • SubscriberKit.preferredFrameRate
  • SubscriberKit.preferredResolution

Gerenciamento de fluxos de assinantes (JavaScript)

Restrição da taxa de quadros de uma transmissão assinada

Você também pode restringir a taxa de quadros da transmissão de vídeo de um assinante.

Para restringir a taxa de quadros de um assinante, chame a função restrictFrameRate() método do objeto Subscriber, passando true:

subscriber.restrictFrameRate(true);

Passe para false e a taxa de quadros do fluxo de vídeo não é limitada:

subscriber.restrictFrameRate(false);

Quando a taxa de quadros é limitada, o quadro de vídeo do Assinante será atualizado uma vez ou menos por segundo. Esse recurso está disponível apenas em sessões encaminhadas. Em sessões retransmitidas, a chamada a este método não produz nenhum efeito.

A restrição da taxa de quadros do assinante traz os seguintes benefícios:

  • Isso reduz o uso da CPU.
  • Isso reduz a largura de banda da rede consumida pelo aplicativo.
  • Isso permite que você assine mais canais simultaneamente.

A redução da taxa de quadros de um assinante não afeta a taxa de quadros do vídeo em outros clientes. Para conhecer outras técnicas para reduzir o uso de recursos em sessões de grande porte, consulte o Guia de conexão com um único par.

Como detectar quando o áudio de um assinante está bloqueado ou desbloqueado

Alguns navegadores bloqueiam automaticamente a reprodução de áudio até que o usuário interaja com a página. Para obter informações completas sobre como lidar com o áudio bloqueado, incluindo como desativar o botão de reprodução padrão e exibir sua própria interface de usuário, consulte Exibição de um elemento de interface do usuário personalizado quando o áudio do assinante estiver bloqueado.

Além disso, o Assinante inclui um isAudioBlocked() método que retorna true se o áudio estiver bloqueado ou false se não for.

Como detectar quando o vídeo de um assinante está desativado

Quando o vídeo do assinante é desativado, o objeto Subscriber dispara um videoDisabled evento. Quando o Media Router desativa o vídeo de um assinante, pode ser necessário ajustar a interface do usuário relacionada a esse assinante.

O reason propriedade do videoDisabled O objeto de evento define o motivo pelo qual o vídeo foi desativado ('publishVideo', 'quality', ou 'subscribeToVideo'). Para a descrição completa de cada motivo, consulte o Inscreva-se no guia de diagnóstico. Antes que o vídeo seja desativado devido a quality, o Assinante envia um videoDisableWarning evento. Para evitar que a transmissão tenha seu vídeo desativado por motivos de qualidade, consulte o Guia de solução alternativa para áudio de assinantes.

subscriber.on('videoDisableWarning', () => {
  showConnectionWarning(subscriber.id);
});

subscriber.on('videoDisableWarningLifted', () => {
  hideConnectionWarning(subscriber.id);
});

subscriber.on('videoDisabled', (event) => {
  if (event.reason === 'quality') {
    showVideoDisabledOverlay(subscriber.id);
  }
});

subscriber.on('videoEnabled', () => {
  hideVideoDisabledOverlay(subscriber.id);
});

Por padrão, o Assinante exibe seu próprio indicador de vídeo desativado quando quality é o motivo. Para substituí-la pela sua própria interface de usuário, defina style.videoDisabledDisplayMode para 'off' nas opções de assinatura. Para saber mais sobre o comportamento específico de cada codec (por exemplo, por que os fluxos H.264 não são afetados pelo fallback baseado na qualidade), consulte o Guia de codecs de vídeo.

Como obter estatísticas de assinantes (Web)

O getStats() O método de um objeto Subscriber fornece informações sobre o fluxo do assinante. Para obter a lista completa de campos disponíveis, consulte o Inscreva-se no guia de diagnóstico.

O código a seguir registra os índices de perda e as taxas de bits a cada segundo:

window.setInterval(() => {
  subscriber.getStats((error, stats) => {
    if (error) {
      console.error('Error getting subscriber stats:', error.message);
      return;
    }
    if (stats.video) {
      console.log('video bitrate:', stats.video.bitrate, 'bps');
      const total = stats.video.packetsLost + stats.video.packetsReceived;
      console.log('video packet loss ratio:', total > 0 ? stats.video.packetsLost / total : 0);
    }
    if (stats.audio) {
      console.log('audio bitrate:', stats.audio.bitrate, 'bps');
    }
  });
}, 1000);

Para obter estatísticas de um fluxo publicado pelo cliente local, é necessário usar uma sessão roteada e definir o testNetwork opção de true ao se inscrever:

const subscriber = session.subscribe(stream, 'container', {
  testNetwork: true,
});

Para obter estatísticas mais detalhadas sobre o stream, use subscriber.getRtcStatsReport(). Para obter uma descrição completa de todos os campos disponíveis, consulte o Guia de observabilidade do cliente.

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

Ao assinar um stream que utiliza o vídeo escalável com esse recurso, você pode definir preferredResolution para 'auto' para gerenciar automaticamente a resolução dos vídeos dos assinantes e otimizar o uso da CPU e da rede. Para obter uma explicação completa sobre como essas dicas funcionam, os valores suportados e as limitações, consulte o Guia de vídeo escalável.

Conjunto preferredResolution e preferredFrameRate nas opções que você passa para Session.subscribe() (ou use Subscriber.setPreferredResolution() e Subscriber.setPreferredFrameRate() (após a assinatura):

// Set at subscribe time using 'auto' (recommended)
const subscriber = session.subscribe(stream, 'container', {
  preferredResolution: 'auto',
});

// Or set explicitly after subscribing
subscriber.setPreferredResolution({ width: 1280, height: 720 });
subscriber.setPreferredFrameRate(30);

// Downgrade for a thumbnail tile
subscriber.setPreferredResolution({ width: 320, height: 240 });
subscriber.setPreferredFrameRate(7);

Gerenciamento de fluxos de assinantes (Android)

Gerencie assinantes, organize eventos e ajuste preferências no Android.

Como detectar quando o vídeo de um assinante está desativado

Quando o vídeo está desativado:

override fun onVideoDisabled(subscriber: SubscriberKit, reason: String) {
    // Video disabled
}

Quando o vídeo recomeçar:

override fun onVideoEnabled(subscriber: SubscriberKit, reason: String) {
    // Video resumed
}

O reason Esse parâmetro explica por que a mudança ocorreu.

Como obter informações sobre um fluxo

O Stream O objeto oferece:

  • getConnection() — Objeto de conexão
  • getCreationTime() — Data e hora de criação
  • hasAudio() — Booleano
  • hasVideo() — Booleano
  • getName() — Nome do stream
  • getStreamId() — ID exclusivo
  • getVideoHeight() — Altura em pixels
  • getVideoWidth() — Largura em pixels
  • getVideoType() — Câmera, compartilhamento de tela ou personalização

Você também pode acompanhar as estatísticas:

  • setAudioStatsListener()
  • setVideoStatsListener()
  • setMediaLinkStatsListener()
  • getRtcStatsReport()

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

Para transmissões de vídeo com resolução adaptável, você pode definir preferências:

  • SubscriberKit.setPreferredFrameRate()
  • SubscriberKit.setPreferredResolution()

Gerenciamento de fluxos de assinantes (Windows)

Gerencie assinantes, organize eventos e defina preferências no Windows.

Como detectar quando o vídeo de um assinante está desativado

O OpenTok Media Router pode interromper o envio de vídeo caso as condições da rede se deteriorem.

O assinante continua recebendo o áudio, se houver.

Quando o vídeo está desativado, o Subscriber o objeto envia um VideoDisabled evento:

subscriber.VideoDisabled += Subscriber_VideoDisabled;

public void Subscriber_VideoDisabled(object sender)
{
    // Display a user interface notification.
}

Quando o vídeo recomeçar:

subscriber.VideoEnabled += Subscriber_VideoEnabled;

public void Subscriber_VideoEnabled(object sender)
{
    // Video resumes for the subscriber.
}

Talvez seja interessante ajustar a interface do usuário em resposta a esses eventos.

Como obter informações sobre um fluxo

O Stream O objeto expõe as seguintes propriedades:

  • Connection — A conexão editorial
  • CreationTime — Carimbo de data e hora da criação do stream
  • HasAudio — Se a transmissão tem áudio
  • HasVideo — Se a transmissão contém vídeo
  • Name — Nome do stream
  • Id — ID exclusivo da transmissão
  • Height — Altura do vídeo em pixels
  • Width — Largura do vídeo em pixels
  • VideoSourceType — Câmera, compartilhamento de tela ou tipo de fonte personalizado

Possível VideoSourceType valores:

  • VideoSourceType.StreamVideoTypeCamera
  • VideoSourceType.StreamVideoTypeScreen
  • VideoSourceType.StreamVideoTypeCustom

Estatísticas de monitoramento

Use esses eventos para monitorar as estatísticas do fluxo:

  • Subscriber.AudioStatsUpdated
  • Subscriber.VideoStatsUpdated
  • Subscriber.MediaLinkStatsUpdated

Para obter estatísticas de baixo nível do RTC:

subscriber.GetRtcStatsReport();

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

Para transmissões que utilizam o recurso de vídeo escalável, configure:

  • Subscriber.PreferredFramerate
  • Subscriber.PreferredResolution

Gerenciamento de fluxos de assinantes (Linux)

Gerencie assinantes, organize eventos e ajuste preferências no Linux.

Como detectar quando o vídeo de uma transmissão está desativado

O on_stream_has_video_changed função de retorno de chamada do otc_session_callbacks A função `struct` é chamada quando a disponibilidade do vídeo de uma transmissão muda.

O stream o parâmetro é um ponteiro para um otc_stream estrutura.

Uso:

otc_stream_get_id(stream)

para recuperar o ID do stream.

Como obter informações sobre um fluxo

Use as seguintes funções para recuperar informações sobre o fluxo:

  • otc_stream_get_connection() — Retorna a conexão de publicação
  • otc_stream_get_creation_time() — Retorna o carimbo de data e hora da criação do fluxo
  • otc_stream_has_audio() — Se a transmissão está reproduzindo áudio
  • otc_stream_has_video() — Se a transmissão está exibindo vídeo
  • otc_stream_has_audio_track() — Se a transmissão possui uma faixa de áudio
  • otc_stream_has_video_track() — Se a transmissão possui uma trilha de vídeo
  • otc_stream_get_name() — Retorna o nome do fluxo
  • otc_stream_get_id() — Retorna o ID exclusivo do fluxo
  • otc_stream_get_video_height() — Retorna a altura do vídeo em pixels
  • otc_stream_get_video_width() — Retorna a largura do vídeo em pixels
  • otc_stream_get_video_type() — Retorna o tipo de vídeo do stream

Tipos de vídeo possíveis:

  • OTC_STREAM_VIDEO_TYPE_CAMERA
  • OTC_STREAM_VIDEO_TYPE_SCREEN

Estatísticas de monitoramento

Utilize estas funções de retorno de chamada do assinante:

  • on_audio_stats()
  • on_video_stats()
  • on_media_link_stats()

Para obter estatísticas de baixo nível do RTC, use:

otc_subscriber_get_rtc_stats_report()

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

Para transmissões que utilizam o recurso de vídeo escalável, é possível definir a taxa de quadros e a resolução preferidas usando:

  • otc_subscriber_set_preferred_framerate()
  • otc_subscriber_set_preferred_resolution()