Ten przewodnik zawiera instrukcje rozwiązywania typowych błędów interfejsu API Google Meet Media.
Rozwiązywanie problemów z kodami błędów
Oto kilka wskazówek dotyczących 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 Meet Media API próbuje nawiązać połączenie dopiero wtedy, gdy uwierzytelniony użytkownik jest już obecny w konferencji w miejscu spotkań. |
INVALID_OFFER |
Zapoznaj się z wymaganiami dotyczącymi oferty, aby sprawdzić, czy nie brakuje jakichś informacji, np. danych o otwarciu kanałów. 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 na konferencji jest niezgodne 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. |
CONNECTIONS_EXHAUSTED |
Do konferencji może się łączyć tylko jeden klient Meet Media API naraz. Jeśli aplikacja ulegnie awarii, podczas próby ponownego połączenia może wyświetlić ten błąd. W takim przypadku zaczekaj około 30 sekund, aż Meet zakończy poprzednie połączenie. Następnie spróbuj ponownie. |
Plan ujednolicony
Jeśli kanały danych się nie otwierają i nie otrzymujesz dźwięku ani obrazu, sprawdź, czy podczas konfigurowania połączenia z lokalnym peerem używany jest tylko plan zintegrowany.
Błąd dotyczący kolejności opisu multimediów
Podczas tworzenia połączenia typu peer-to-peer z ofertą protokołu opisu sesji (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 linie opisu mediów w odpowiedzi SDP nie są zgodne z opisami medió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 zgrupowane razem podczas ustawiania obiektu połączenia peer-to-peer. Przeplatane opisy multimediów nie są obsługiwane.
Poniższy przykładowy kod pokazuje, jak prawidłowo dopasowywać 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 skonfigurowany w przypadku wszystkich opisów multimediów w ofercie SDP.
Aby naprawić ten błąd, sprawdź, czy każdy opis multimediów w ofercie SDP zawiera 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
W tych sekcjach znajdziesz informacje, które pomogą Ci rozwiązać problemy 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 na pasku adresu:
chrome://webrtc-internals
. - Przejdź do sekcji
Stats graph for inbound-rtp
. - Sprawdź każdy wykres audio, aby zobaczyć, czy pakiety są odbierane.
Jeśli używasz klienta referencyjnego C++, sprawdź, czy funkcja OnAudioFrame
jest kiedykolwiek wywoływana.
Sprawdź zakresy OAuth.
Dźwięk jest przesyłany tylko wtedy, gdy w początkowym żądaniu połączenia podano odpowiedni zakres. Aby rozwiązać ten problem, podaj poprawne zakresy OAuth 2.0. Więcej informacji znajdziesz w opisie interfejsu API Meet Media.
Sprawdź, czy konferencja jest prawidłowo skonfigurowana
Gdy klient łączy się z serwerami Google Meet, nie jest automatycznie dopuszczany do konferencji. Upewnij się, że na kanale danych kontroli sesji dotarła do Ciebie aktualizacja zasobu kontroli sesji o stanie
STATE_JOINED
.{"sessionStatus":{"connectionState":"STATE_JOINED"}}
Sprawdź, czy są inni uczestnicy konferencji, których ścieżki audio nie są wyciszone.
Sprawdź sygnał dźwięku
Meet zapewnia dźwięk tylko wtedy, gdy wskażesz to w ofercie SDP. W ofercie musi być 3 audiodeskrypcje w formacie tylko do odbioru.
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 do wysł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 przeniesiesz przetwarzanie danych na inny wątek, pamiętaj, aby utworzyć kopie danych audio.
AudioFrame.pcm16
to odwołanie do danych źródłowych, więc próba uzyskania do nich dostępu po OnAudioFrame
spowoduje nieokreślone działanie, np. błąd segmentacji.
Rozwiązywanie problemów z filmami
W następnych sekcjach znajdziesz informacje, które pomogą Ci rozwiązać problemy z filmami w aplikacji.
Sprawdzanie dzienników
Jeśli używasz klienta internetowego w przeglądarce Chrome:
- Otwórz nową kartę i wpisz na pasku adresu:
chrome://webrtc-internals
. - Przejdź do sekcji
Stats graph for inbound-rtp
. - Sprawdź każdy wykres, aby zobaczyć, czy pakiety są odbierane.
Jeśli używasz klienta referencyjnego C++, sprawdź, czy funkcja OnVideoFrame
jest kiedykolwiek wywoływana.
Sprawdź zakresy OAuth.
Film jest przesyłany tylko wtedy, gdy w początkowej prośbie o utworzenie połączenia podano odpowiedni zakres. Aby rozwiązać ten problem, podaj poprawne zakresy OAuth 2.0. Więcej informacji znajdziesz w opisie interfejsu Meet Media API.
Sprawdź, czy konferencja jest prawidłowo skonfigurowana
Gdy klient łączy się z serwerami Meet, nie jest automatycznie dołączany do konferencji. Upewnij się, że na kanale danych kontroli sesji dotarła do Ciebie aktualizacja zasobu kontroli sesji o stanie
STATE_JOINED
.{"sessionStatus":{"connectionState":"STATE_JOINED"}}
Sprawdź, czy są inni uczestnicy, których strumienie wideo nie są wyciszone.
Sprawdź sygnał wideo
Meet udostępnia obraz tylko wtedy, gdy jest to sygnalizowane w ofercie SDP. W ofercie musi być 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 SDP z n
opisami mediów wideo tylko do wysyłania, gdzie n
to liczba opisów medió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
m=video …
występuje w ofercie SDP wysłanej do serwerów Meet. - 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ę pod każdym wierszemm=video
w odpowiedzi SDP. - Sprawdź, czy na serwery Meet zostało wysłane i odebrane prawidłowe zdarzenie
VideoAssignmentRequest
. Powodzenie lub niepowodzenie powinno być przekazywane z powrotem do klienta tym samym kanałem danych.
Rozwiązywanie problemów z mniejszą liczbą strumieni wideo niż oczekiwano
- Sprawdź, czy oferta SDP zawiera prawidłową liczbę linii
m=video …
. - Upewnij się, że wszystkie opisy
m=video
w odpowiedzi SDP zawierają atrybuta=sendonly
luba=sendrecv
. Wszelkie linie oznaczone w odpowiedzi symbolema=recvonly
zmniejszają liczbę strumieni wysyłanych do klienta.
Sprawdzanie implementacji obserwatora
Jeśli przeniesiesz przetwarzanie danych na inny wątek, pamiętaj, aby utworzyć kopie danych wideo.
VideoFrame.frame
to odwołanie do danych źródłowych, więc próba uzyskania do nich dostępu po OnVideoFrame
spowoduje nieokreślone działanie, takie jak błąd segmentacji.