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 algumas dicas para resolver 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.
INVALID_OFFER Leia os requisitos da oferta para verificar se há algum detalhe ausente, como a abertura de canais de dados obrigatórios. Também é possível comparar a string de oferta do app com o exemplo de oferta e investigar as diferenças.
INCOMPATIBLE_DEVICE Um ou mais dispositivos na conferência não são compatíveis com os clientes da API Meet Media. O app não poderá participar, então informe isso aos usuários finais.
CONNECTIONS_EXHAUSTED Apenas um cliente da API Meet Media pode se conectar a uma videoconferê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 encerre a conexão anterior. Depois, tente novamente.

Plano unificado

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

Erro no pedido da descrição da mídia

Ao criar uma conexão ponto a ponto com uma oferta de Protocolo e descrição de sessão (SDP), talvez você encontre 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 da SDP não correspondem às descrições de mídia na oferta da 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 os tipos de mídia semelhantes estão configurados corretamente e agrupados ao definir o objeto de conexão de par. Não é possível usar descrições de mídia intercaladas.

O exemplo de código abaixo mostra como fazer a correspondência correta das 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 do DTLS

Ao definir o atributo de função do DTLS, você pode encontrar 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 do SDP.

Para corrigir esse erro, verifique se cada descrição de mídia na oferta do 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 app.

Verificar os registros

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

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

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

Verificar os escopos do OAuth

O áudio 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 OAuth 2.0 corretos. Para mais informações, consulte Escopos da API Meet Media.

Verificar se a conferência está configurada corretamente

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

    {"sessionStatus":{"connectionState":"STATE_JOINED"}}
    
  • Confirme se há outros participantes da conferência com transmissões de áudio ativadas.

Verificar o sinal de áudio

O Meet só vai fornecer áudio se você sinalizar isso na oferta 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 linha de execução diferente. AudioFrame.pcm16 é uma referência aos dados subjacentes. Portanto, tentar acessá-lo após 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 na barra de endereço: chrome://webrtc-internals.
  2. Acesse a seção Stats graph for inbound-rtp.
  3. Inspecione cada gráfico de vídeo para saber se os pacotes estão sendo recebidos.

Se você estiver usando o cliente de referência em 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 OAuth 2.0 corretos. Para mais informações, consulte Escopos da API Meet Media.

Verificar se a conferência está configurada corretamente

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

    {"sessionStatus":{"connectionState":"STATE_JOINED"}}
    
  • Confirme se há outros participantes da conferência com transmissões de vídeo que não estão com o som desativado.

Verificar seu sinal de vídeo

O Meet só oferece vídeo se ele for indicado na oferta SDP. É preciso ter até três descrições de mídia de vídeo somente para recebimento na oferta.

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 para 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 vídeo

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

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

  • Verifique se a oferta do SDP contém o número correto de linhas m=video ….
  • Verifique se todas as descrições de m=video na resposta do SDP contêm um atributo a=sendonly ou a=sendrecv. Todas as linhas marcadas como 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 de dados para uma linha de execução diferente. VideoFrame.frame é uma referência aos dados subjacentes. Portanto, tentar acessá-lo após OnVideoFrame resultará em um comportamento indefinido, como uma falha de segmentação.