Rozwiązywanie problemów z interfejsem Meet Media API

W tym przewodniku znajdziesz instrukcje rozwiązywania typowych błędów interfejsu Google Meet Media API.

Rozwiązywanie problemów z kodami błędów

Oto wskazówki dotyczące rozwiązywania problemów z kodami błędów zwracanymi przez connectActiveConference punkt końcowy:

Kody błędów
NO_ACTIVE_CONFERENCE Sprawdź, czy klient interfejsu Meet Media API próbuje się połączyć dopiero wtedy, gdy uwierzytelniony użytkownik jest już obecny na konferencji w przestrzeni spotkania. Jeśli sprawdzasz, czy konferencja się rozpoczęła, użyj zamiast tego zdarzeń rozpoczęcia konferencji.
INVALID_OFFER Przeczytaj wymagania dotyczące oferty, aby sprawdzić, czy nie brakuje żadnych szczegółów, np. otwierania kanałów wymaganych danych. Możesz też porównać ciąg oferty swojej aplikacji z przykładową ofertą i sprawdzić, czy występują jakieś różnice.
INCOMPATIBLE_DEVICE Co najmniej 1 urządzenie na konferencji nie jest zgodne z klientami interfejsu Meet Media API. Twoja aplikacja nie będzie mogła dołączyć, więc możesz poinformować o tym użytkowników. Przyczyny niezgodności urządzeń to m.in. to, że konto powiązane z urządzeniem jest uważane za konto osoby niepełnoletniej. Więcej informacji znajdziesz w sekcji Wymagania dotyczące użytkowników.
UNSUPPORTED_PLATFORM_PRESENT Co najmniej 1 urządzenie na konferencji nie jest zgodne z klientami interfejsu Meet Media API. Twoja aplikacja nie będzie mogła dołączyć, więc możesz poinformować o tym użytkowników. Przyczyny braku obsługi platformy to m.in. aplikacje mobilne, które nie spełniają minimalnych wersji aplikacji mobilnych, oraz dołączanie z nieobsługiwanych platform. Więcej informacji znajdziesz w sekcji Wymagania dotyczące użytkowników.
CONNECTIONS_EXHAUSTED Z konferencją może się połączyć tylko 1 klient interfejsu Meet Media API naraz. Jeśli Twoja aplikacja ulegnie awarii, podczas próby ponownego połączenia może pojawić się ten błąd. W takim przypadku poczekaj około 30 sekund, aż Meet wyłączy poprzednie połączenie. Następnie spróbuj ponownie.
CONSENTER_ABSENT Na spotkaniu nie ma odpowiedniego użytkownika. W przypadku spotkań należących do konsumentów upewnij się, że inicjator jest na spotkaniu. W przypadku spotkań należących do właściciela obszaru roboczego powinien być co najmniej 1 członek organizacji, który jest właścicielem spotkania. Więcej informacji znajdziesz w sekcji Wymagania dotyczące użytkowników.
DISABLED_BY_ADMIN Administrator wyłączył interfejs Meet Media API w swojej organizacji. Jeśli napotkasz ten problem, nie będzie można go rozwiązać podczas spotkania. Więcej informacji znajdziesz na ilustracji 3 w artykule Cykl życia interfejsu Meet Media API.
DISABLED_BY_HOST_CONTROL Gospodarz wyłączył interfejs Meet Media API na spotkaniu. Twoja aplikacja nie będzie mogła dołączyć, więc możesz poinformować o tym użytkowników. Więcej informacji znajdziesz na ilustracji 5 w artykule Cykl życia interfejsu Meet Media API.
DISABLED_DUE_TO_WATERMARKING Gdy znak wodny jest włączony, interfejs Meet Media API nie może dołączyć do spotkania. Możesz poinformować o tym użytkowników. Więcej informacji znajdziesz na ilustracji 2 w artykule Cykl życia interfejsu Meet Media API.
DISABLED_DUE_TO_ENCRYPTION Gdy szyfrowanie jest włączone, interfejs Meet Media API nie może dołączyć do spotkania. Nie można tego zmienić podczas rozmowy w Meet. Możesz poinformować o tym użytkowników. Więcej informacji znajdziesz na ilustracji 2 w artykule Cykl życia interfejsu Meet Media API.

Subskrypcja Unified

Jeśli kanały danych nigdy się nie otwierają i nie otrzymujesz dźwięku ani obrazu, sprawdź, czy podczas konfigurowania lokalnego połączenia równorzędnego używana jest tylko subskrypcja Unified.

Błąd kolejności opisu multimediów

Podczas tworzenia połączenia równorzędnego z ofertą protokołu Session Description Protocol (SDP) może pojawić się ten błąd:

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.

Oznacza to, że wiersze opisu multimediów w odpowiedzi SDP nie są zgodne z opisami multimediów w ofercie SDP:

Oferta SDP Odpowiedź 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

Aby naprawić ten błąd, upewnij się, że podobne typy multimediów są prawidłowo skonfigurowane i pogrupowane podczas ustawiania obiektu połączenia równorzędnego. Opisy multimediów z przeplotem nie są obsługiwane.

Poniższy przykładowy kod pokazuje, jak prawidłowo dopasować opisy multimediów:

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

Błąd atrybutu roli DTLS

Podczas ustawiania atrybutu roli DTLS może pojawić się ten błąd:

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

Ten błąd występuje, gdy atrybut a=setup:< > nie jest prawidłowo ustawiony dla wszystkich opisów multimediów w ofercie SDP.

Aby naprawić ten błąd, upewnij się, że każdy opis multimediów w ofercie SDP ma jeden z tych wymaganych atrybutów:

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

Rozwiązywanie problemów z dźwiękiem

Poniższe sekcje mogą pomóc w rozwiązaniu problemów z dźwiękiem w aplikacji.

Sprawdzanie dzienników

Jeśli używasz klienta internetowego w przeglądarce Chrome:

  1. Otwórz nową kartę i wpisz w pasku adresu: chrome://webrtc-internals.
  2. Otwórz sekcję Stats graph for inbound-rtp.
  3. Sprawdź każdy wykres dźwięku, aby zobaczyć, czy pakiety są odbierane.

Jeśli używasz klienta referencyjnego C++, sprawdź, czy OnAudioFrame jest wywoływana.

Sprawdzanie zakresów OAuth

Dźwięk jest przesyłany tylko wtedy, gdy w początkowym żądaniu połączenia podany jest odpowiedni zakres. Aby rozwiązać ten błąd, podaj prawidłowe zakresy OAuth 2.0. Więcej informacji znajdziesz w sekcji Zakresy interfejsu Meet Media API.

Sprawdzanie, czy konferencja jest prawidłowo skonfigurowana

  • Gdy klient połączy się z serwerami Google Meet, nie zostanie automatycznie dopuszczony do konferencji. Upewnij się, że otrzymano aktualizację zasobu kontroli sesji przez kanał danych kontroli sesji ze stanem STATE_JOINED.

    {"sessionStatus":{"connectionState":"STATE_JOINED"}}
    
  • Sprawdź, czy są inni uczestnicy konferencji whose audio streams are not wyciszone.

Sprawdzanie sygnału audio

Meet udostępnia dźwięk tylko wtedy, gdy jest on sygnalizowany w ofercie SDP. W ofercie muszą znajdować się 3 opisy multimediów audio tylko do odbioru w ofercie.

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

Jeśli serwery Meet otrzymają prawidłową ofertę, odpowiedzą odpowiedzią SDP z 3 opisami multimediów audio tylko do wysyłania.

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

Sprawdzanie implementacji obserwatora

Jeśli przenosisz przetwarzanie danych do innego wątku, pamiętaj, aby tworzyć kopie danych audio. AudioFrame.pcm16 jest w rzeczywistości odniesieniem do danych źródłowych, więc próba uzyskania do nich dostępu po wywołaniu funkcji OnAudioFrame spowoduje niezdefiniowane zachowanie, np. błąd segmentacji.

Rozwiązywanie problemów z filmami

Poniższe sekcje mogą pomóc w rozwiązaniu problemów z filmami w aplikacji.

Sprawdzanie dzienników

Jeśli używasz klienta internetowego w przeglądarce Chrome:

  1. Otwórz nową kartę i wpisz w pasku adresu: chrome://webrtc-internals.
  2. Otwórz sekcję Stats graph for inbound-rtp.
  3. Sprawdź każdy wykres wideo, aby zobaczyć, czy pakiety są odbierane.

Jeśli używasz klienta referencyjnego C++, sprawdź, czy wywoływana jest funkcja OnVideoFrame.

Sprawdzanie zakresów OAuth

Obraz jest przesyłany tylko wtedy, gdy w początkowym żądaniu połączenia podany jest odpowiedni zakres. Aby rozwiązać ten błąd, podaj prawidłowe zakresy OAuth 2.0. Więcej informacji znajdziesz w sekcji Zakresy interfejsu Meet Media API.

Sprawdzanie, czy konferencja jest prawidłowo skonfigurowana

  • Gdy klient połączy się z serwerami Meet, nie zostanie automatycznie dopuszczony do konferencji. Upewnij się, że otrzymano aktualizację zasobu kontroli sesji przez kanał danych kontroli sesji ze stanem STATE_JOINED.

    {"sessionStatus":{"connectionState":"STATE_JOINED"}}
    
  • Sprawdź, czy są inni uczestnicy konferencji whose video streams are not muted.

Sprawdzanie sygnału wideo

Meet udostępnia obraz tylko wtedy, gdy jest on sygnalizowany w ofercie SDP. W ofercie musi znajdować się maksymalnie 3 opisy multimediów wideo tylko do odbioru.

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

Jeśli Meet otrzyma prawidłową ofertę, odpowie odpowiedzią SDP z n opisami multimediów wideo tylko do wysyłania, gdzie n to liczba opisów multimediów wideo w ofercie 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
. . .

Rozwiązywanie problemów z brakiem obrazu

  • Sprawdź, czy w ofercie SDP wysłanej do serwerów Meet znajduje się m=video ….
  • Sprawdź, czy a=recvonly jest atrybutem w każdym wierszu m=video.
  • Sprawdź, czy w odpowiedzi SDP znajduje się taka sama liczba wierszy m=video.
  • Sprawdź, czy a=sendonly lub a=sendrecv są atrybutami w każdym wierszu m=video w odpowiedzi SDP.
  • Sprawdź, czy do serwerów Meet zostało wysłane i przez nie odebrane prawidłowe żądanie VideoAssignmentRequest. Informacja o powodzeniu lub niepowodzeniu powinna zostać przekazana klientowi przez ten sam kanał danych.

Rozwiązywanie problemów z mniejszą niż oczekiwana liczbą strumieni wideo

  • Sprawdź, czy oferta SDP zawiera prawidłową liczbę wierszy m=video ….
  • Upewnij się, że wszystkie opisy m=video w odpowiedzi SDP zawierają atrybut a=sendonly lub a=sendrecv. Wszystkie wiersze oznaczone w odpowiedzi jako a=recvonly zmniejszają liczbę strumieni wysyłanych do klienta o tę samą wartość.

Sprawdzanie implementacji obserwatora

Jeśli przenosisz przetwarzanie danych do innego wątku, pamiętaj, aby tworzyć kopie danych wideo. VideoFrame.frame jest w rzeczywistości odniesieniem do danych źródłowych, więc próba uzyskania do nich dostępu po wywołaniu funkcji OnVideoFrame spowoduje niezdefiniowane zachowanie, np. błąd segmentacji.