Soluciona problemas y corrige errores de la API de Meet Media

En esta guía, se proporcionan instrucciones para resolver errores comunes de la API de Google Meet Media.

Cómo solucionar problemas relacionados con los códigos de error

A continuación, se incluyen sugerencias para solucionar problemas relacionados con los códigos de error que muestra el extremo connectActiveConference:

Códigos de error
NO_ACTIVE_CONFERENCE Verifica que el cliente de la API de Meet Media solo intente conectarse después de que el usuario autenticado ya esté presente en una conferencia en el espacio de reunión.
INVALID_OFFER Lee los requisitos de las ofertas para verificar si falta algún detalle, como los canales de datos de apertura obligatorios. También puedes comparar la cadena de oferta de tu app con la oferta de ejemplo y analizar las diferencias.
INCOMPATIBLE_DEVICE Uno o más dispositivos de la conferencia no son compatibles con los clientes de la API de Meet Media. Tu app no podrá unirse, por lo que debes comunicar esto a los usuarios finales.
CONNECTIONS_EXHAUSTED Solo un cliente de la API de Meet Media puede conectarse a una conferencia a la vez. Si tu app falla, es posible que veas este error si intenta volver a conectarse. En este caso, espera unos 30 segundos para que Meet agote el tiempo de espera de la conexión anterior. Luego, vuelve a intentarlo.

Plan unificado

Si los canales de datos nunca se abren y nunca recibes audio ni video, verifica que solo se use el Plan unificado cuando configures la conexión de pares local.

Error en el orden de la descripción de contenido multimedia

Cuando crees una conexión entre pares con una oferta de Protocolo de descripción de sesión (SDP), es posible que veas el siguiente error:

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.

Esto significa que las líneas de descripción de los medios en la respuesta de SDP no coinciden con las descripciones de los medios en la oferta de SDP:

Oferta de SDP Respuesta de 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 corregir este error, asegúrate de que los tipos de medios similares estén configurados correctamente y agrupados cuando configures el objeto de conexión de pares. No se admiten descripciones de contenido multimedia intercaladas.

En la siguiente muestra de código, se muestra cómo hacer coincidir correctamente las descripciones de los medios:

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'});

Error de atributo de rol de DTLS

Cuando configures el atributo de rol de DTLS, es posible que veas el siguiente error:

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

Este error ocurre cuando el atributo a=setup:< > no está configurado correctamente para todas las descripciones de contenido multimedia en la oferta de SDP.

Para corregir este error, asegúrate de que cada descripción de contenido multimedia en la oferta de SDP tenga uno de los siguientes atributos obligatorios:

  • 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
. . .

Soluciona problemas de audio

Las siguientes secciones pueden ayudarte a resolver problemas de audio en tu app.

Verifica los registros

Si usas el cliente web en un navegador Chrome, haz lo siguiente:

  1. Abre una pestaña nueva y, en la barra de direcciones, escribe chrome://webrtc-internals.
  2. Ve a la sección etiquetada como Stats graph for inbound-rtp.
  3. Inspecciona cada gráfico de audio para ver si se reciben paquetes.

Si usas el cliente de referencia de C++, verifica si se llama a OnAudioFrame.

Verifica los permisos de OAuth

El audio solo se transmite si se proporciona el permiso adecuado con la solicitud de conexión inicial. Para resolver el error, asegúrate de proporcionar los permisos de OAuth 2.0 correctos. Para obtener más información, consulta los alcances de la API de Meet Media.

Verifica que la conferencia esté configurada correctamente

  • Cuando el cliente se conecta con los servidores de Google Meet, no se admite automáticamente a la conferencia. Asegúrate de haber recibido una actualización de recursos de control de sesión a través del canal de datos de control de sesión con un estado de STATE_JOINED.

    {"sessionStatus":{"connectionState":"STATE_JOINED"}}
    
  • Confirma que haya otros participantes de la conferencia cuyas transmisiones de audio no estén silenciadas.

Verifica la señal de audio

Meet solo proporciona audio si lo indicas en la oferta de SDP. Debe haber tres descripciones de contenido multimedia de audio solo para recibir en la 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
. . .

Si los servidores de Meet reciben una oferta válida, responden con una respuesta de SDP con tres descripciones de contenido multimedia de audio de solo envío.

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
. . .

Verifica tu implementación del observador

Asegúrate de hacer copias de los datos de audio si trasladas el procesamiento de datos a un subproceso diferente. AudioFrame.pcm16 es, en realidad, una referencia a los datos subyacentes, por lo que intentar acceder a ella después de OnAudioFrame genera un comportamiento no definido, como una falla de segmentación.

Soluciona problemas de video

Las siguientes secciones pueden ayudarte a resolver problemas de video en tu app.

Verifica los registros

Si usas el cliente web en un navegador Chrome, haz lo siguiente:

  1. Abre una pestaña nueva y, en la barra de direcciones, escribe chrome://webrtc-internals.
  2. Ve a la sección etiquetada como Stats graph for inbound-rtp.
  3. Inspecciona cada gráfico de video para ver si se reciben paquetes.

Si usas el cliente de referencia de C++, verifica si se llama a OnVideoFrame.

Verifica los permisos de OAuth

El video solo se transmite si se proporciona el alcance adecuado con la solicitud de conexión inicial. Para resolver el error, asegúrate de proporcionar los permisos de OAuth 2.0 correctos. Para obtener más información, consulta los alcances de la API de Meet Media.

Verifica que la conferencia esté configurada correctamente

  • Cuando el cliente se conecta con los servidores de Meet, no se admite automáticamente a la conferencia. Asegúrate de haber recibido una actualización de recursos de control de sesión a través del canal de datos de control de sesión con un estado de STATE_JOINED.

    {"sessionStatus":{"connectionState":"STATE_JOINED"}}
    
  • Confirma que haya otros participantes de la conferencia cuyas transmisiones de video no estén silenciadas.

Verifica tu señal de video

Meet solo proporciona video si se indica en la oferta de SDP. En la oferta, debe haber hasta tres descripciones de contenido multimedia de video de solo recepción.

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
. . .

Si Meet recibe una oferta válida, responde con una respuesta de SDP con n descripciones de contenido multimedia de video de solo envío, donde n es la cantidad de descripciones de contenido multimedia de video en la oferta de 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
. . .

Soluciona problemas relacionados con la ausencia de video

  • Comprueba que m=video … exista en la oferta de SDP que se envió a los servidores de Meet.
  • Verifica que a=recvonly sea un atributo en cada línea m=video.
  • Verifica que haya la misma cantidad de líneas m=video en la respuesta SDP.
  • Verifica que a=sendonly o a=sendrecv sean atributos en cada línea m=video de la respuesta de SDP.
  • Verifica que los servidores de Meet hayan enviado y recibido correctamente un VideoAssignmentRequest. El éxito o el error se deben comunicar al cliente a través del mismo canal de datos.

Soluciona problemas relacionados con la transmisión de menos videos de lo esperado

  • Verifica que la oferta de SDP contenga la cantidad correcta de líneas m=video ….
  • Asegúrate de que todas las descripciones de m=video en la respuesta de SDP contengan un atributo a=sendonly o a=sendrecv. Cualquier línea marcada como a=recvonly en la respuesta reduce la cantidad de transmisiones enviadas al cliente en esa cantidad.

Verifica tu implementación del observador

Asegúrate de hacer copias de los datos de video si trasladas el procesamiento de datos a un subproceso diferente. VideoFrame.frame es, en realidad, una referencia a los datos subyacentes, por lo que intentar acceder a ella después de OnVideoFrame generará un comportamiento no definido, como una falla de segmentación.