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:
- Otwórz nową kartę i wpisz na pasku adresu:
chrome://webrtc-internals
. - Przejdź do sekcji oznaczonej symbolem
Stats graph for inbound-rtp
. - 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:
- Otwórz nową kartę i wpisz na pasku adresu:
chrome://webrtc-internals
. - Przejdź do sekcji oznaczonej symbolem
Stats graph for inbound-rtp
. - 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 wierszum=video
. - Sprawdź, czy w odpowiedzi SDP jest taka sama liczba wierszy
m=video
. - Sprawdź, czy atrybuty
a=sendonly
luba=sendrecv
znajdują się w każdym wierszum=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ą atrybuta=sendonly
luba=sendrecv
. Wszelkie wiersze oznaczone symbolema=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.