Rozwiązywanie problemów z interfejsem Meet Media API

Ten przewodnik zawiera instrukcje rozwiązywania typowych błędów 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 punkt końcowy connectActiveConference:

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 zdarzeń rozpoczęcia konferencji.
INVALID_OFFER Zapoznaj się z wymaganiami dotyczącymi oferty, aby sprawdzić, czy nie brakuje żadnych szczegółów, np. otwierania wymaganych kanałów danych. Możesz też porównać ciąg znaków oferty aplikacji z przykładową ofertą i sprawdzić, czy występują jakieś różnice.
INCOMPATIBLE_DEVICE Co najmniej jedno urządzenie w sali konferencyjnej nie jest zgodne z klientami interfejsu Meet Media API. Aplikacja nie będzie mogła dołączyć, więc możesz poinformować o tym użytkowników. Przyczyną braku zgodności może być na przykład to, że konto powiązane z urządzeniem należy do osoby niepełnoletniej. Więcej informacji znajdziesz w wymaganiach dotyczących użytkowników.
UNSUPPORTED_PLATFORM_PRESENT Co najmniej jedno urządzenie w sali konferencyjnej nie jest zgodne z klientami interfejsu Meet Media API. Aplikacja nie będzie mogła dołączyć, więc możesz poinformować o tym użytkowników. Przyczyny nieobsługiwanej platformy to m.in. aplikacje mobilne, które nie spełniają minimalnych wymagań wersji aplikacji mobilnej, oraz dołączanie z nieobsługiwanych platform. Więcej informacji znajdziesz w wymaganiach dotyczących użytkowników.
CONNECTIONS_EXHAUSTED Tylko jeden klient interfejsu Meet Media API może łączyć się z rozmową naraz. Jeśli aplikacja ulegnie awarii, ten błąd może się pojawić, gdy spróbuje się ponownie połączyć. 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 uczestnika, który wyraził zgodę. W przypadku spotkań należących do konsumentów upewnij się, że inicjator jest obecny na spotkaniu. W przypadku spotkań właściciela obszaru roboczego co najmniej 1 członek organizacji powinien być właścicielem spotkania. Więcej informacji znajdziesz w wymaganiach dotyczących osób wyrażających zgodę.
DISABLED_BY_ADMIN Administrator wyłączył interfejs Meet Media API w swojej organizacji. Jeśli tak się stanie, nie będzie można tego zmienić podczas spotkania. Więcej informacji znajdziesz na rysunku 3 w artykule Cykl życia interfejsu Meet Media API.
DISABLED_BY_HOST_CONROL Gospodarz wyłączył interfejs Meet Media API na potrzeby spotkania. Aplikacja nie będzie mogła dołączyć, więc możesz poinformować o tym użytkowników. Więcej informacji znajdziesz na rysunku 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 rysunku 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 połączenia w Meet. Możesz poinformować o tym użytkowników. Więcej informacji znajdziesz na rysunku 2 w artykule Cykl życia interfejsu Meet Media API.

Ujednolicony plan

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

Błąd kolejności opisu multimediów

Podczas tworzenia połączenia peer-to-peer z ofertą Session Description Protocol (SDP) może pojawić się 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, sprawdź, czy podobne typy multimediów są prawidłowo skonfigurowane i zgrupowane podczas ustawiania obiektu połączenia równorzędnego. Przeplatane opisy multimediów 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ę 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 korzystasz z klienta internetowego w przeglądarce Chrome:

  1. Otwórz nową kartę i wpisz na pasku adresu: chrome://webrtc-internals.
  2. Przejdź do sekcji oznaczonej symbolem 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 kiedykolwiek wywoływana jest funkcja OnAudioFrame.

Sprawdzanie zakresów OAuth

Dźwięk jest przesyłany tylko wtedy, gdy w początkowej prośbie o połączenie podano odpowiedni zakres. Aby rozwiązać ten problem, podaj prawidłowe zakresy OAuth 2.0. Więcej informacji znajdziesz w artykule Zakresy interfejsu Meet Media API.

Sprawdź, czy konferencja jest prawidłowo skonfigurowana.

  • Gdy klient połączy się z serwerami Google Meet, nie zostanie automatycznie wpuszczony na konferencję. Upewnij się, że w kanale danych kontroli sesji otrzymano aktualizację zasobu kontroli sesji ze stanem STATE_JOINED.

    {"sessionStatus":{"connectionState":"STATE_JOINED"}}
    
  • Sprawdź, czy są inni uczestnicy konferencji, których strumienie audio nie są wyciszone.

Sprawdź sygnał audio

Meet udostępnia tylko dźwięk, jeśli zasygnalizujesz to w ofercie SDP. Oferta musi zawierać 3 opisy multimediów audio tylko do odtwarzania.

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ę, odpowiadają odpowiedzią SDP z trzema 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 audio do innego wątku, pamiętaj o utworzeniu kopii danych audio. AudioFrame.pcm16 jest w zasadzie odwołaniem do danych źródłowych, więc próba uzyskania do niego dostępu po OnAudioFrame skutkuje nieokreślonym zachowaniem, np. błędem 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 korzystasz z klienta internetowego w przeglądarce Chrome:

  1. Otwórz nową kartę i wpisz na pasku adresu: chrome://webrtc-internals.
  2. Przejdź do sekcji oznaczonej symbolem Stats graph for inbound-rtp.
  3. Sprawdź wykres każdego filmu, aby zobaczyć, czy pakiety są odbierane.

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

Sprawdzanie zakresów OAuth

Film jest przesyłany tylko wtedy, gdy w początkowej prośbie o połączenie podano odpowiedni zakres. Aby rozwiązać ten problem, podaj prawidłowe zakresy OAuth 2.0. Więcej informacji znajdziesz w artykule Zakresy interfejsu Meet Media API.

Sprawdź, czy konferencja jest prawidłowo skonfigurowana.

  • Gdy klient połączy się z serwerami Meet, nie zostanie automatycznie wpuszczony na konferencję. Upewnij się, że w kanale danych kontroli sesji otrzymano aktualizację zasobu kontroli sesji ze stanem STATE_JOINED.

    {"sessionStatus":{"connectionState":"STATE_JOINED"}}
    
  • Sprawdź, czy są inni uczestnicy konferencji, których strumienie wideo nie są wyciszone.

Sprawdzanie sygnału wideo

Meet udostępnia wideo tylko wtedy, gdy jest ono sygnalizowane w ofercie SDP. Oferta musi zawierać maksymalnie 3 opisy multimediów wideo, które są przeznaczone 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 na serwery Meet znajduje się m=video ….
  • Sprawdź, czy a=recvonly jest atrybutem w każdym wierszu m=video.
  • Sprawdź, czy w odpowiedzi SDP jest taka sama liczba wierszy m=video.
  • Sprawdź, czy atrybuty a=sendonly lub a=sendrecv znajdują się w każdym wierszu m=video odpowiedzi SDP.
  • Sprawdź, czy do serwerów Meet został wysłany i odebrany prawidłowy VideoAssignmentRequest. Informacja o powodzeniu lub niepowodzeniu powinna być przekazywana klientowi tym samym kanałem 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. Wszelkie wiersze oznaczone symbolem a=recvonly w odpowiedzi zmniejszają liczbę strumieni wysyłanych do klienta o odpowiednią wartość.

Sprawdzanie implementacji obserwatora

Jeśli przenosisz przetwarzanie danych wideo do innego wątku, pamiętaj o utworzeniu kopii danych wideo. VideoFrame.frame jest w zasadzie odwołaniem do danych źródłowych, więc próba uzyskania do niego dostępu po OnVideoFrame spowoduje nieokreślone zachowanie, np. błąd segmentacji.