Устранение и исправление ошибок Meet Media API

В этом руководстве описаны способы устранения распространенных ошибок API Google Meet Media.

Устранение ошибок по кодам ошибок

Вот несколько советов по устранению ошибок, возвращаемых конечной точкой connectActiveConference :

коды ошибок
NO_ACTIVE_CONFERENCE Убедитесь, что клиент Meet Media API пытается подключиться только после того, как аутентифицированный пользователь уже присутствует в конференции в пространстве совещания . Если вы отслеживаете начало конференции, используйте вместо этого события начала конференции .
INVALID_OFFER Внимательно изучите требования предложения , чтобы проверить наличие недостающих деталей, например, открытие каналов, требующих передачи данных. Вы также можете сравнить текст предложения вашего приложения с примером предложения и изучить любые различия.
INCOMPATIBLE_DEVICE Одно или несколько устройств в конференции несовместимы с клиентами Meet Media API. Ваше приложение не сможет подключиться, поэтому вам следует сообщить об этом конечным пользователям. Причинами несовместимости устройств могут быть, например, если учетная запись, связанная с устройством, считается несовершеннолетней. Для получения дополнительной информации см. раздел «Требования к конечным пользователям» .
UNSUPPORTED_PLATFORM_PRESENT Одно или несколько устройств, участвующих в конференции , несовместимы с клиентами Meet Media API. Ваше приложение не сможет подключиться, поэтому вам следует сообщить об этом конечным пользователям. Причинами неподдерживаемой платформы могут быть мобильные приложения, не соответствующие минимальным требованиям к версиям мобильных приложений, и подключение с неподдерживаемых платформ. Для получения дополнительной информации см. раздел «Требования к конечным пользователям» .
CONNECTIONS_EXHAUSTED К конференции одновременно может подключаться только один клиент Meet Media API. Если ваше приложение аварийно завершает работу, при попытке повторного подключения может появиться эта ошибка. В этом случае подождите около 30 секунд, пока Meet не истечет время ожидания предыдущего подключения. Затем попробуйте снова.
CONSENTER_ABSENT На встрече отсутствует лицо, имеющее право на получение согласия. Для встреч, проводимых самими потребителями, убедитесь, что инициатор присутствует на встрече. Для встреч, проводимых владельцами рабочих мест, должен присутствовать как минимум один член организации, которая является владельцем встречи. Для получения дополнительной информации см. требования к лицам, имеющим право на получение согласия .
DISABLED_BY_ADMIN Администратор отключил Meet Media API для своей организации. В этом случае изменить это во время совещания будет невозможно. Дополнительную информацию см. на рисунке 3 в разделе «Жизненный цикл Meet Media API» .
DISABLED_BY_HOST_CONTROL Организатор отключил Meet Media API для этой встречи. Ваше приложение не сможет присоединиться, поэтому вам следует сообщить об этом конечным пользователям. Для получения дополнительной информации см. рисунок 5 в разделе «Жизненный цикл Meet Media API» .
DISABLED_DUE_TO_WATERMARKING Если включено добавление водяных знаков, доступ к Meet Media API в совещании будет закрыт. Вы можете сообщить об этом конечным пользователям. Для получения дополнительной информации см. рисунок 2 в разделе «Жизненный цикл Meet Media API» .
DISABLED_DUE_TO_ENCRYPTION При включенном шифровании доступ к Meet Media API в совещание закрыт. Это нельзя изменить во время звонка Meet. Вы можете сообщить об этом конечным пользователям. Для получения дополнительной информации см. рисунок 2 в разделе «Жизненный цикл Meet Media API» .

Единый план

Если каналы передачи данных никогда не открываются и вы никогда не получаете аудио или видео, убедитесь, что при настройке локального подключения к пиру используется только унифицированный план .

ошибка порядка описания медиафайлов

При создании однорангового соединения с использованием предложения протокола описания сессии (SDP) может появиться ошибка:

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.

Это означает, что строки описания медиафайлов в ответе SDP не соответствуют описаниям медиафайлов в предложении SDP:

Предложение SDP ответ SDP
m=audio 9 UDP/TLS/RTP/SAVPF 111m=audio 9 UDP/TLS/RTP/SAVPF 111
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99m=audio 9 UDP/TLS/RTP/SAVPF 111
m=audio 9 UDP/TLS/RTP/SAVPF 111m=audio 9 UDP/TLS/RTP/SAVPF 111
m=audio 9 UDP/TLS/RTP/SAVPF 111m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99

Для устранения этой ошибки убедитесь, что похожие типы мультимедиа правильно настроены и сгруппированы вместе при задании объекта подключения к одноранговой сети. Чередование описаний мультимедиа не поддерживается.

Следующий пример кода демонстрирует, как правильно сопоставить описания медиафайлов:

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

ошибка атрибута роли DTLS

При настройке атрибута роли DTLS может появиться ошибка:

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

Эта ошибка возникает, когда атрибут a=setup:< > некорректно задан для всех описаний медиафайлов в предложении SDP.

Для устранения этой ошибки убедитесь, что каждое описание медиафайла в предложении SDP содержит один из следующих обязательных атрибутов:

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

Устранение неполадок со звуком

Следующие разделы помогут решить проблемы со звуком в вашем приложении.

Проверьте журналы.

Если вы используете веб-клиент в браузере Chrome:

  1. Откройте новую вкладку и введите в адресную строку: chrome://webrtc-internals .
  2. Перейдите в раздел « Stats graph for inbound-rtp .
  3. Проверьте каждый аудиографик, чтобы убедиться, что пакеты принимаются.

Если вы используете эталонный клиент C++, проверьте, вызывается ли когда-либо OnAudioFrame .

Проверьте области действия OAuth.

Передача аудиосигнала осуществляется только в том случае, если в первоначальном запросе на подключение указана соответствующая область действия (scope). Для устранения ошибки убедитесь, что указаны правильные области действия OAuth 2.0. Дополнительную информацию см. в разделе «Области действия Meet Media API» .

Убедитесь, что конференция настроена правильно.

  • Когда клиент подключается к серверам Google Meet, он не получает автоматического допуска к конференции. Убедитесь, что вы получили обновление ресурса управления сессией по каналу данных управления сессией со статусом STATE_JOINED .

    {"sessionStatus":{"connectionState":"STATE_JOINED"}}
    
  • Убедитесь, что у других участников конференции нет отключенного звука.

Проверьте наличие аудиосигнала.

Meet предоставляет аудиоконтент только в том случае, если вы укажете это в предложении SDP . В предложении должно быть три описания аудиофайлов, предназначенных только для приема .

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

Если серверы Meet получают действительное предложение, они отвечают SDP-ответом, содержащим три описания аудиофайлов, предназначенных только для отправки.

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

Проверьте реализацию вашего наблюдателя.

Обязательно создавайте копии аудиоданных, если переносите обработку данных в другой поток. AudioFrame.pcm16 фактически является ссылкой на базовые данные, поэтому попытка доступа к нему после OnAudioFrame приводит к неопределенному поведению, например, к ошибке сегментации.

Устранение неполадок с видео.

Следующие разделы помогут решить проблемы с видео в вашем приложении.

Проверьте журналы.

Если вы используете веб-клиент в браузере Chrome:

  1. Откройте новую вкладку и введите в адресную строку: chrome://webrtc-internals .
  2. Перейдите в раздел « Stats graph for inbound-rtp .
  3. Проверьте каждый видеографик, чтобы убедиться, что пакеты данных принимаются.

Если вы используете эталонный клиент C++, проверьте, вызывается ли когда-либо метод OnVideoFrame .

Проверьте области действия OAuth.

Видео передается только в том случае, если в первоначальном запросе на подключение указана соответствующая область действия (scope). Для устранения ошибки убедитесь, что указаны правильные области действия OAuth 2.0. Дополнительную информацию см. в разделе «Области действия Meet Media API» .

Убедитесь, что конференция настроена правильно.

  • Когда клиент подключается к серверам Meet, он не получает автоматического допуска к конференции. Убедитесь, что вы получили обновление ресурса управления сессией по каналу данных управления сессией со статусом STATE_JOINED .

    {"sessionStatus":{"connectionState":"STATE_JOINED"}}
    
  • Убедитесь, что видеопотоки других участников конференции не отключены.

Проверьте наличие сигнала для видео.

Meet предоставляет видео только в том случае, если это указано в предложении SDP . В предложении должно быть не более трех описаний видеоконтента, предназначенных только для получения.

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

Если Meet получает действительное предложение, он отвечает SDP-ответом, содержащим n описаний видеоконтента, доступных только для отправки, где n — количество описаний видеоконтента в 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
. . .

Устранение неполадок, нет видео.

  • Убедитесь, что m=video … присутствует в предложении SDP, отправленном на серверы Meet.
  • Убедитесь, что атрибут a=recvonly присутствует в каждой строке m=video .
  • Убедитесь, что в ответе SDP присутствует одинаковое количество строк m=video .
  • Убедитесь, что атрибуты a=sendonly или a=sendrecv присутствуют в каждой строке m=video в ответе SDP.
  • Убедитесь, что VideoAssignmentRequest был успешно отправлен на серверы Meet и получен ими. Информация об успехе или неудаче должна быть передана клиенту по тому же каналу передачи данных.

Устранено меньше неполадок в видеопотоках, чем ожидалось.

  • Убедитесь, что предложение SDP содержит правильное количество строк m=video … .
  • Убедитесь, что все описания m=video в ответе SDP содержат либо атрибут a a=sendonly , либо a=sendrecv . Любые строки, помеченные a=recvonly в ответе, уменьшают количество потоков, отправляемых клиенту, на это значение.

Проверьте реализацию вашего наблюдателя.

Обязательно создавайте копии видеоданных, если переносите обработку данных в другой поток. VideoFrame.frame по сути является ссылкой на базовые данные, поэтому попытка доступа к нему после вызова OnVideoFrame приведет к неопределенному поведению, например, к ошибке сегментации.