Resolver e corrigir erros da API Meet Media

Este guia fornece instruções sobre como resolver erros comuns da API Google Meet Media.

Resolver problemas com códigos de erro

Confira dicas para solucionar problemas com códigos de erro retornados pelo endpoint connectActiveConference:

Códigos de erro
NO_ACTIVE_CONFERENCE Verifique se o cliente da API Meet Media só tenta se conectar depois que o usuário autenticado já está presente em uma conferência no espaço de reunião. Se você estiver fazendo uma pesquisa para o início da conferência, use Eventos de início da conferência.
INVALID_OFFER Leia os requisitos da oferta para verificar se há detalhes ausentes, como a abertura de canais de dados necessários. Você também pode comparar a string de oferta do seu app com a oferta de exemplo e investigar as diferenças.
INCOMPATIBLE_DEVICE Um ou mais dispositivos na conferência não são compatíveis com clientes da API Meet Media. Seu app não poderá participar, então informe isso aos usuários finais. Um dos motivos para isso é se a conta associada ao dispositivo for considerada de menor. Para mais informações, consulte os requisitos do usuário final.
UNSUPPORTED_PLATFORM_PRESENT Um ou mais dispositivos na conferência não são compatíveis com clientes da API Meet Media. Seu app não poderá participar, então informe isso aos usuários finais. Os motivos para uma plataforma não compatível incluem apps para dispositivos móveis que não atendem às versões mínimas e a participação em plataformas não compatíveis. Para mais informações, consulte os requisitos do usuário final.
CONNECTIONS_EXHAUSTED Apenas um cliente da API Meet Media pode se conectar a uma conferência por vez. Se o app falhar, esse erro poderá aparecer se ele tentar se reconectar. Nesse caso, aguarde cerca de 30 segundos para que o Meet atinja o tempo limite da conexão anterior. Depois, tente novamente.
CONSENTER_ABSENT Não há um consentidor qualificado na reunião. Para reuniões de consumidores, verifique se o organizador está na reunião. Para reuniões de proprietários de espaços de trabalho, é necessário que pelo menos um membro da organização seja o proprietário da reunião. Para mais informações, consulte os requisitos de consentimento.
DISABLED_BY_ADMIN O administrador desativou a API Meet Media na organização. Se isso acontecer, não será possível mudar durante a duração de uma reunião. Para mais informações, consulte a Figura 3 em Conheça o ciclo de vida da API Media.
DISABLED_BY_HOST_CONROL O organizador desativou a API Meet Media para a reunião. Seu app não poderá participar, então informe isso aos usuários finais. Para mais informações, consulte a Figura 5 em Conheça o ciclo de vida da API Media.
DISABLED_DUE_TO_WATERMARKING Quando a marca d'água está ativada, a API Meet Media não pode entrar na reunião. Você pode comunicar isso aos usuários finais. Para mais informações, consulte a Figura 2 em Conheça o ciclo de vida da API Media.
DISABLED_DUE_TO_ENCRYPTION Quando a criptografia está ativada, a API Meet Media não pode entrar na reunião. Essa configuração não pode ser alterada durante uma chamada do Meet. Você pode comunicar isso aos usuários finais. Para mais informações, consulte a Figura 2 em Conheça o ciclo de vida da API Media.

Plano unificado

Se os canais de dados nunca abrirem e você nunca receber áudio ou vídeo, verifique se apenas o Plano unificado é usado ao configurar a conexão de peering local.

Erro na ordem da descrição de mídia

Ao criar uma conexão ponto a ponto com uma oferta do Protocolo de descrição de sessão (SDP), talvez você veja o erro:

Failed to execute 'setRemoteDescription' on 'RTCPeerConnection':
Failed to set remote answer sdp:
The order of m-lines in answer doesn't match order in offer. Rejecting answer.

Isso significa que as linhas de descrição de mídia na resposta do SDP não correspondem às descrições de mídia na oferta do SDP:

Oferta de SDP Resposta do SDP
m=audio 9 UDP/TLS/RTP/SAVPF 111 m=audio 9 UDP/TLS/RTP/SAVPF 111
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 m=audio 9 UDP/TLS/RTP/SAVPF 111
m=audio 9 UDP/TLS/RTP/SAVPF 111 m=audio 9 UDP/TLS/RTP/SAVPF 111
m=audio 9 UDP/TLS/RTP/SAVPF 111 m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99

Para corrigir esse erro, verifique se tipos de mídia semelhantes estão configurados corretamente e agrupados ao definir o objeto de conexão de mesmo nível. Não é possível usar descrições de mídia intercaladas.

O exemplo de código a seguir mostra como corresponder corretamente às descrições de mídia:

C++

rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection;

// Signal the entire video at once.
for (uint32_t i = 0; i < configurations.receiving_video_stream_count; ++i) {
    webrtc::RtpTransceiverInit video_init;
    video_init.direction = webrtc::RtpTransceiverDirection::kRecvOnly;
    video_init.stream_ids = {absl::StrCat("video_stream_", i)};

    webrtc::RTCErrorOr<rtc::scoped_refptr<webrtc::RtpTransceiverInterface>>
        video_result = peer_connection->AddTransceiver(
            cricket::MediaType::MEDIA_TYPE_VIDEO, video_init);
  // . . .
}

JavaScript

pc = new RTCPeerConnection();

// Signal the entire video at once.
pc.addTransceiver(video, {'direction':'recvonly'});
pc.addTransceiver(video, {'direction':'recvonly'});
pc.addTransceiver(video, {'direction':'recvonly'});

Erro no atributo de função DTLS

Ao definir o atributo de função DTLS, talvez você veja o erro:

All DTLS roles must be one of [ACTIVE, ACTPASS].

Esse erro ocorre quando o atributo a=setup:< > não está definido corretamente para todas as descrições de mídia na oferta de SDP.

Para corrigir esse erro, verifique se cada descrição de mídia na oferta de SDP tem um dos seguintes atributos obrigatórios:

  • a=setup:actpass
  • a=setup:active
v=0
o=- 4743178474630771513 3 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=extmap-allow-mixed
a=msid-semantic: WMS
. . .
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101
. . .
a=setup:actpass
. . .
m=audio 39807 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126
. . .
a=setup:actpass
. . .

Resolver problemas de áudio

As seções a seguir podem ajudar a resolver problemas de áudio no seu app.

Verificar os registros

Se você estiver usando o cliente da Web em um navegador Chrome:

  1. Abra uma nova guia e digite chrome://webrtc-internals na barra de endereço.
  2. Acesse a seção Stats graph for inbound-rtp.
  3. Inspecione cada gráfico de áudio para ver se os pacotes estão sendo recebidos.

Se você estiver usando o cliente de referência C++, verifique se OnAudioFrame é chamado.

Verificar os escopos do OAuth

O áudio só é transmitido se o escopo adequado for fornecido com a solicitação de conexão inicial. Para resolver o erro, forneça os escopos corretos do OAuth 2.0. Para mais informações, consulte Escopos da API Meet Media.

Verifique se a conferência está configurada corretamente

  • Quando o cliente se conecta aos servidores do Google Meet, ele não é admitido automaticamente na conferência. Verifique se você recebeu uma atualização do recurso de controle de sessão pelo canal de dados de controle de sessão com um estado de STATE_JOINED.

    {"sessionStatus":{"connectionState":"STATE_JOINED"}}
    
  • Confirme se há outros participantes na conferência com fluxos de áudio não silenciados.

Verificar o sinal de áudio

O Meet só fornece áudio se você indicar isso na oferta de SDP. É preciso haver três descrições de mídia de áudio somente para recebimento na oferta.

m=audio 39807 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126
. . .
a=mid:0
. . .
a=recvonly
. . .
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
. . .
m=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126
. . .
a=mid:1
. . .
a=recvonly
. . .
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
. . .
m=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126
. . .
a=mid:2
. . .
a=recvonly
. . .
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
. . .

Se uma oferta válida for recebida pelos servidores do Meet, eles vão responder com uma resposta SDP com três descrições de mídia de áudio somente para envio.

m=audio 19306 UDP/TLS/RTP/SAVPF 111
. . .
a=mid:0
. . .
a=sendonly
a=msid:virtual-6666 virtual-6666
. . .
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10;useinbandfec=1
. . .
m=audio 9 UDP/TLS/RTP/SAVPF 111
. . .
a=mid:1
. . .
a=sendonly
a=msid:virtual-6667 virtual-6667
. . .
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10;useinbandfec=1
. . .
m=audio 9 UDP/TLS/RTP/SAVPF 111
. . .
a=mid:2
. . .
a=sendonly
a=msid:virtual-6668 virtual-6668
. . .
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10;useinbandfec=1
. . .

Verificar a implementação do observador

Faça cópias dos dados de áudio se você mover o processamento de dados para uma outra linha de execução. AudioFrame.pcm16 é efetivamente uma referência aos dados subjacentes. Portanto, tentar acessar depois de OnAudioFrame resulta em um comportamento indefinido, como uma falha de segmentação.

Resolver problemas de vídeo

As seções a seguir podem ajudar a resolver problemas de vídeo no seu app.

Verificar os registros

Se você estiver usando o cliente da Web em um navegador Chrome:

  1. Abra uma nova guia e digite chrome://webrtc-internals na barra de endereço.
  2. Acesse a seção Stats graph for inbound-rtp.
  3. Inspecione cada gráfico de vídeo para ver se os pacotes estão sendo recebidos.

Se você estiver usando o cliente de referência C++, verifique se OnVideoFrame é chamado.

Verificar os escopos do OAuth

O vídeo só será transmitido se o escopo adequado for fornecido com a solicitação de conexão inicial. Para resolver o erro, forneça os escopos corretos do OAuth 2.0. Para mais informações, consulte Escopos da API Meet Media.

Verifique se a conferência está configurada corretamente

  • Quando o cliente se conecta aos servidores do Meet, ele não é admitido automaticamente na conferência. Verifique se você recebeu uma atualização do recurso de controle de sessão pelo canal de dados de controle de sessão com um estado de STATE_JOINED.

    {"sessionStatus":{"connectionState":"STATE_JOINED"}}
    
  • Confirme se há outros participantes na conferência com os fluxos de vídeo não silenciados.

Verificar o sinal para vídeo

O Meet só fornece vídeo se ele for sinalizado na oferta de SDP. A oferta precisa ter até três descrições de mídia de vídeo somente para recebimento.

v=0
o=- 4743178474630771513 3 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=extmap-allow-mixed
a=msid-semantic: WMS
. . .
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 35 36 37 38 102 103 104 105 106 107 108 109 127 125 39 40 41 42 43 44 45 46 47 48 112 113 114 115 116 117 118 49
. . .
a=setup:actpass
a=mid:1
. . .
a=recvonly
. . .
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
. . .

Se o Meet receber uma oferta válida, ele vai responder com uma resposta SDP com n descrições de mídia de vídeo somente envio, em que n é o número de descrições de mídia de vídeo na oferta SDP.

v=0
o=- 0 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=msid-semantic: WMS virtual-video-7777/7777
a=ice-lite
. . .
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99
. . .
a=setup:passive
a=mid:1
. . .
a=msid:virtual-video-7777/7777 virtual-video-7777/7777
a=rtcp-mux
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtcp-fb:96 goog-remb
. . .

Resolver problemas de falta de vídeo

  • Verifique se m=video … existe na oferta de SDP enviada aos servidores do Meet.
  • Verifique se a=recvonly é um atributo em todas as linhas m=video.
  • Verifique se há o mesmo número de linhas m=video na resposta do SDP.
  • Verifique se a=sendonly ou a=sendrecv são atributos em todas as linhas m=video da resposta do SDP.
  • Verifique se um VideoAssignmentRequest foi enviado e recebido pelos servidores do Meet. O sucesso ou a falha precisam ser comunicados ao cliente pelo mesmo canal de dados.

Resolver problemas com menos transmissões de vídeo do que o esperado

  • Verifique se a oferta de SDP contém o número correto de linhas m=video ….
  • Verifique se todas as descrições m=video na resposta do SDP contêm um atributo a=sendonly ou a=sendrecv. As linhas marcadas com a=recvonly na resposta reduzem a quantidade de streams enviados ao cliente.

Verificar a implementação do observador

Faça cópias dos dados de vídeo se você mover o processamento para uma outra linha de execução. VideoFrame.frame é uma referência aos dados subjacentes. Portanto, tentar acessar depois de OnVideoFrame resultará em um comportamento indefinido, como uma falha de segmentação.