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:actpassa=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:
- Otwórz nową kartę i wpisz w pasku adresu:
chrome://webrtc-internals. - Otwórz sekcję
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
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:
- Otwórz nową kartę i wpisz w pasku adresu:
chrome://webrtc-internals. - Otwórz sekcję
Stats graph for inbound-rtp. - 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=recvonlyjest atrybutem w każdym wierszum=video. - Sprawdź, czy w odpowiedzi SDP znajduje się taka sama liczba wierszy
m=video. - Sprawdź, czy
a=sendonlyluba=sendrecvsą atrybutami w każdym wierszum=videow 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=videow odpowiedzi SDP zawierają atrybuta=sendonlyluba=sendrecv. Wszystkie wiersze oznaczone w odpowiedzi jakoa=recvonlyzmniejszają 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.