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 Media de Google Meet.

Soluciona 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 devuelve 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. Si sondeos para el inicio de la conferencia, usa Eventos de inicio de la conferencia.
INVALID_OFFER Lee los requisitos de la oferta para verificar si falta algún detalle, como la apertura de los canales de datos requeridos. 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 puedes comunicarles esto a tus usuarios finales. Entre los motivos por los que un dispositivo puede ser incompatible, se incluye el caso en que la cuenta asociada al dispositivo se considere de menor de edad. Para obtener más información, consulta los requisitos del usuario final.
UNSUPPORTED_PLATFORM_PRESENT 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 puedes comunicarles esto a tus usuarios finales. Entre los motivos por los que una plataforma no es compatible, se incluyen las apps para dispositivos móviles que no cumplen con las versiones mínimas de las apps para dispositivos móviles y la unión desde plataformas no compatibles. Para obtener más información, consulta los requisitos del usuario final.
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.
CONSENTER_ABSENT No hay un otorgante de consentimiento apto en la reunión. En el caso de las reuniones propiedad del consumidor, asegúrate de que el iniciador esté en la reunión. En el caso de las reuniones de propietarios de espacios de trabajo, debe haber al menos un miembro de esa organización que sea propietario de la reunión. Para obtener más información, consulta los requisitos de consentimiento.
DISABLED_BY_ADMIN El administrador inhabilitó la API de Meet Media para su organización. Si esto sucede, no se podrá cambiar durante la duración de la reunión. Para obtener más información, consulta la Figura 3 en Ciclo de vida de la API de Meet Media.
DISABLED_BY_HOST_CONROL El organizador inhabilitó la API de Meet Media para la reunión. Tu app no podrá unirse, por lo que puedes comunicarles esto a tus usuarios finales. Para obtener más información, consulta la figura 5 en Ciclo de vida de la API de Meet Media.
DISABLED_DUE_TO_WATERMARKING Cuando se habilita la marca de agua, no se permite el acceso de la API de Meet Media a la reunión. Puedes comunicar esto a tus usuarios finales. Para obtener más información, consulta la Figura 2 en Conoce el ciclo de vida de la API de Media.
DISABLED_DUE_TO_ENCRYPTION Cuando la encriptación está habilitada, no se permite el acceso de la API de Meet Media a la reunión. Esto no se puede cambiar durante una llamada de Meet. Puedes comunicar esto a tus usuarios finales. Para obtener más información, consulta la Figura 2 en Conoce el ciclo de vida de la API de Media.

Plan unificado

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

Error en el orden de la descripción de los medios

Cuando creas una conexión de punto a punto con una oferta de Session Description Protocol (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 medios en la respuesta del SDP no coinciden con las descripciones de medios en la oferta del 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 establezcas el objeto de conexión entre pares. No se admiten las descripciones de medios intercaladas.

En el siguiente ejemplo 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 en el 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 se produce cuando el atributo a=setup:< > no está configurado correctamente para todas las descripciones de medios en la oferta de SDP.

Para corregir este error, asegúrate de que cada descripción de medios 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

En las siguientes secciones, se explica cómo 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 escribe chrome://webrtc-internals en la barra de direcciones.
  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 alguna vez se llama a OnAudioFrame.

Verifica los permisos de OAuth

El audio 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 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 en la conferencia. Asegúrate de haber recibido una actualización del recurso 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 en la conferencia cuyos flujos de audio no estén silenciados.

Verifica la señal de audio

Meet solo proporciona audio si lo indicas en la oferta de SDP. Debe haber tres descripciones de medios de audio de solo recepción 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 que incluye tres descripciones de medios 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 la implementación del observador

Asegúrate de hacer copias de los datos de audio si mueves el procesamiento de datos a un subproceso diferente. AudioFrame.pcm16 es, en efecto, una referencia a los datos subyacentes, por lo que intentar acceder a ella después de OnAudioFrame genera un comportamiento indefinido, como un error 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 escribe chrome://webrtc-internals en la barra de direcciones.
  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 alguna vez 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 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 en la conferencia. Asegúrate de haber recibido una actualización del recurso 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 en la conferencia cuyos flujos de video no estén silenciados.

Verifica la señal de video

Meet solo proporciona video si se indica en la oferta de SDP. Debe haber hasta tres descripciones de medios de video de solo recepción en la 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
. . .

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

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

Soluciona problemas relacionados con una cantidad de transmisiones de video inferior a la esperada

  • 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 del SDP contengan un atributo a=sendonly o a=sendrecv. Las líneas marcadas como a=recvonly en la respuesta reducen la cantidad de transmisiones enviadas al cliente en esa cantidad.

Verifica la implementación del observador

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