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:
- Abra uma nova guia e digite na barra de endereço:
chrome://webrtc-internals
. - Acesse a seção
Stats graph for inbound-rtp
. - 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:
- Abra uma nova guia e digite na barra de endereço:
chrome://webrtc-internals
. - Acesse a seção
Stats graph for inbound-rtp
. - 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 linham=video
. - Verifique se um número igual de linhas
m=video
existe na resposta do SDP. - Verifique se
a=sendonly
oua=sendrecv
são atributos em cada linham=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 atributoa=sendonly
oua=sendrecv
. Todas as linhas marcadas comoa=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.