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:
- Abra uma nova guia e digite
chrome://webrtc-internals
na barra de endereço. - Acesse a seção
Stats graph for inbound-rtp
. - 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:
- Abra uma nova guia e digite
chrome://webrtc-internals
na barra de endereço. - Acesse a seção
Stats graph for inbound-rtp
. - 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 linhasm=video
. - Verifique se há o mesmo número de linhas
m=video
na resposta do SDP. - Verifique se
a=sendonly
oua=sendrecv
são atributos em todas as linhasm=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 atributoa=sendonly
oua=sendrecv
. As linhas marcadas coma=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.