במדריך הזה מוסבר איך לפתור שגיאות נפוצות ב-Google Meet Media API.
פתרון בעיות בקודי שגיאה
ריכזנו כאן טיפים לפתרון בעיות שקשורות לקודי שגיאה שמוחזרים מנקודת הקצה connectActiveConference:
| קודי שגיאה | |
|---|---|
NO_ACTIVE_CONFERENCE |
מוודאים שהלקוח של Meet Media API מנסה להתחבר רק אחרי שהמשתמש המאומת כבר נמצא בשיחה ועידתית במרחב הפגישה. אם אתם מבצעים בדיקה חוזרת כדי לראות מתי שיחת הוועידה מתחילה, אתם צריכים להשתמש באירועים של התחלת שיחת הוועידה. |
INVALID_OFFER |
כדאי לעיין בדרישות המבצע כדי לוודא שלא חסרים פרטים, כמו פתיחת ערוצים שנדרשים לנתונים. אפשר גם להשוות את מחרוזת המבצע של האפליקציה לדוגמה למבצע ולבדוק אם יש הבדלים. |
INCOMPATIBLE_DEVICE |
אחד או יותר מהמכשירים בחדר הישיבות לא תואמים ללקוחות של Meet Media API. האפליקציה לא תוכל להצטרף, לכן כדאי להודיע על כך למשתמשי הקצה. סיבות למכשירים לא תואמים כוללות מצבים שבהם החשבון שמשויך למכשיר נחשב כחשבון של משתמש מתחת לגיל. מידע נוסף זמין במאמר בנושא דרישות משתמשי קצה. |
UNSUPPORTED_PLATFORM_PRESENT |
אחד או יותר מהמכשירים בחדר הישיבות לא תואמים ללקוחות של Meet Media API. האפליקציה לא תוכל להצטרף, לכן כדאי להודיע על כך למשתמשי הקצה. הסיבות לכך שהפלטפורמה לא נתמכת כוללות אפליקציות לנייד שלא עומדות בגרסאות המינימליות של האפליקציות לנייד, והצטרפות מפלטפורמות שלא נתמכות. מידע נוסף זמין במאמר בנושא דרישות משתמשי קצה. |
CONNECTIONS_EXHAUSTED |
בכל פעם יכול להתחבר לשיחת ועידה רק לקוח API אחד של Meet Media. אם האפליקציה קורסת, יכול להיות שהשגיאה הזו תופיע אם היא תנסה להתחבר מחדש. במקרה כזה, צריך לחכות כ-30 שניות עד שהחיבור הקודם יפסיק לפעול ב-Meet. לאחר מכן אפשר לנסות שוב. |
CONSENTER_ABSENT |
אין בפגישה משתתפים שאישרו את ההקלטה. בפגישות בבעלות הצרכן, מוודאים שהיוזם נמצא בפגישה. בפגישות של בעלי סביבת עבודה, צריך להיות לפחות חבר אחד בארגון שהוא הבעלים של הפגישה. מידע נוסף זמין במאמר בנושא דרישות בנוגע למשתמשים שמאשרים את הסכמתם. |
DISABLED_BY_ADMIN |
האדמין השבית את Meet Media API בארגון שלו. אם נתקלתם בבעיה הזו, אי אפשר לשנות את ההגדרה במהלך הפגישה. מידע נוסף מופיע בתרשים 3 במאמר Meet Media API lifecycle. |
DISABLED_BY_HOST_CONTROL |
המארח השבית את Meet Media API בפגישה. האפליקציה לא תוכל להצטרף, לכן כדאי להודיע על כך למשתמשי הקצה. מידע נוסף מופיע באיור 5 במאמר מחזור החיים של Meet Media API. |
DISABLED_DUE_TO_WATERMARKING |
כשסימן המים מופעל, אי אפשר להשתמש ב-Meet Media API בפגישה. אפשר להודיע על כך למשתמשי הקצה. מידע נוסף מופיע בתרשים 2 במאמר מחזור החיים של Meet Media API. |
DISABLED_DUE_TO_ENCRYPTION |
כשמפעילים הצפנה, אי אפשר להשתמש ב-Meet Media API בפגישה. אי אפשר לשנות את ההגדרה הזו במהלך שיחה ב-Meet. אפשר להודיע על כך למשתמשי הקצה. מידע נוסף מופיע בתרשים 2 במאמר מחזור החיים של Meet Media API. |
מינוי מאוחד
אם ערוצי הנתונים אף פעם לא נפתחים ואתם אף פעם לא מקבלים אודיו או וידאו, צריך לוודא שרק Unified Plan נמצא בשימוש כשמגדירים את חיבור ה-peer המקומי.
שגיאה בסדר של תיאורי מדיה
כשיוצרים חיבור ישיר (P2P) עם הצעה של Session Description Protocol (SDP), יכול להיות שתופיע השגיאה:
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.
כלומר, שורות תיאור המדיה בתשובת ה-SDP לא תואמות לתיאורי המדיה בהצעת ה-SDP:
| מבצע SDP | תשובת 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 |
כדי לפתור את השגיאה הזו, צריך לוודא שסוגי מדיה דומים מוגדרים בצורה נכונה ומקובצים יחד כשמגדירים את אובייקט חיבור העמיתים. אין תמיכה בתיאורי מדיה שמשולבים בתוכן.
בדוגמת הקוד הבאה אפשר לראות איך מתאימים נכון את תיאורי המדיה:
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'});
שגיאה במאפיין התפקיד של DTLS
כשמגדירים את מאפיין התפקיד DTLS, יכול להיות שתופיע השגיאה:
All DTLS roles must be one of [ACTIVE, ACTPASS].
השגיאה הזו מתרחשת כשמאפיין a=setup:< > לא מוגדר בצורה תקינה לכל תיאורי המדיה בהצעת ה-SDP.
כדי לפתור את השגיאה הזו, צריך לוודא שלכל תיאור מדיה בהצעת ה-SDP יש אחד מהמאפיינים הנדרשים הבאים:
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
. . .
פתרון בעיות שמע
בקטעים הבאים מוסבר איך לפתור בעיות שקשורות לאודיו באפליקציה.
בדיקת היומנים
אם אתם משתמשים בלקוח האינטרנט בדפדפן Chrome:
- פותחים כרטיסייה חדשה ומזינים בסרגל הכתובות:
chrome://webrtc-internals. - עוברים לקטע עם התווית
Stats graph for inbound-rtp. - בודקים כל תרשים אודיו כדי לראות אם מתקבלים חבילות נתונים.
אם אתם משתמשים בלקוח ההפניה C++, בדקו אם מתבצעת קריאה ל-OnAudioFrame.
אימות היקפי ההרשאות של OAuth
העברת האודיו מתבצעת רק אם היקף השימוש המתאים מצורף לבקשת החיבור הראשונית. כדי לפתור את השגיאה, צריך לוודא שציינתם את היקפי ההרשאות הנכונים של OAuth 2.0. מידע נוסף זמין במאמר היקפי ההרשאות של Meet Media API.
בודקים שהוועידה מוגדרת בצורה נכונה
כשהלקוח מתחבר לשרתי Google Meet, הוא לא מקבל אישור כניסה לפגישה באופן אוטומטי. חשוב לוודא שקיבלתם עדכון של משאב לבקרת סשן בערוץ הנתונים של בקרת הסשן, עם סטטוס של
STATE_JOINED.{"sessionStatus":{"connectionState":"STATE_JOINED"}}מוודאים שיש משתתפים אחרים בוועידה שההשתקה של זרמי האודיו שלהם לא בוטלה.
אימות האות שלכם לאודיו
ב-Meet אפשר להעביר רק אודיו אם מציינים זאת בהצעת ה-SDP. בהצעה צריכים להיות שלושה תיאורים של מדיה עם אודיו, שניתן רק לקבל אותם.
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
. . .
אם השרתים של Meet מקבלים הצעה תקפה, הם משיבים עם תשובת SDP שכוללת שלוש תיאורים של מדיה אודיו, שמוגדרים לשליחה בלבד.
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
. . .
בדיקת ההטמעה של ה-Observer
אם מעבירים את עיבוד הנתונים לשרשור אחר, חשוב ליצור עותקים של נתוני האודיו.
AudioFrame.pcm16 הוא למעשה הפניה לנתונים הבסיסיים, ולכן ניסיון לגשת אליו אחרי OnAudioFrame יוביל להתנהגות לא מוגדרת, כמו שגיאת פילוח.
פתרון בעיות בסרטונים
הקטעים הבאים יכולים לעזור לפתור בעיות שקשורות לסרטונים באפליקציה.
בדיקת היומנים
אם אתם משתמשים בלקוח האינטרנט בדפדפן Chrome:
- פותחים כרטיסייה חדשה ומזינים בסרגל הכתובות:
chrome://webrtc-internals. - עוברים לקטע עם התווית
Stats graph for inbound-rtp. - בודקים את הגרף של כל סרטון כדי לראות אם החבילות מתקבלות.
אם אתם משתמשים בלקוח ההפניה C++, בדקו אם מתבצעת קריאה ל-OnVideoFrame.
אימות היקפי ההרשאות של OAuth
הסרטון מועבר רק אם היקף השימוש המתאים מסופק עם בקשת החיבור הראשונית. כדי לפתור את השגיאה, צריך לוודא שציינתם את היקפי ההרשאות הנכונים של OAuth 2.0. מידע נוסף זמין במאמר היקפי ההרשאות של Meet Media API.
בודקים שהוועידה מוגדרת בצורה נכונה
כשהלקוח מתחבר לשרתי Meet, הוא לא מקבל אישור אוטומטי להצטרף לפגישה. חשוב לוודא שקיבלתם עדכון של משאב לבקרת סשן בערוץ הנתונים של בקרת הסשן, עם סטטוס של
STATE_JOINED.{"sessionStatus":{"connectionState":"STATE_JOINED"}}מוודאים שיש משתתפים אחרים בוועידה ששידורי הווידאו שלהם לא מושתקים.
אימות האות שלכם לסרטון
ב-Meet, הווידאו זמין רק אם הוא מופיע בהצעת ה-SDP. במבצע צריכים להיות עד שלושה תיאורים של מדיה מסוג וידאו, שמוגדרים כתיאורים לקבלה בלבד.
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
. . .
אם Meet מקבל הצעה תקפה, הוא מגיב עם תשובת SDP עם n תיאורים של מדיה מסוג וידאו לשליחה בלבד, כאשר n הוא מספר התיאורים של מדיה מסוג וידאו בהצעת ה-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
. . .
פתרון בעיות שקשורות להצגת סרטונים
- בודקים ש-
m=video …קיים בהצעת ה-SDP שנשלחה לשרתי Meet. - בודקים שמאפיין
a=recvonlyמופיע מתחת לכל שורה שלm=video. - בודקים שיש מספר שווה של שורות
m=videoבתשובת ה-SDP. - בודקים ש
a=sendonlyאוa=sendrecvהם מאפיינים מתחת לכל שורהm=videoבתשובה של SDP. - בודקים ש
VideoAssignmentRequestנשלח לשרתי Meet ושהתקבל בהם. ההצלחה או הכישלון צריכים להיות מועברים בחזרה ללקוח באותו ערוץ נתונים.
פתרון בעיות שקשורות למספר נמוך מהצפוי של סטרימינג של סרטונים
- בודקים שהצעת ה-SDP מכילה את המספר הנכון של שורות
m=video …. - מוודאים שכל התיאורים של
m=videoבתשובת ה-SDP מכילים את המאפייןa=sendonlyאוa=sendrecv. כל שורה שמסומנת ב-a=recvonlyבתשובה מפחיתה את מספר הזרמים שנשלחים ללקוח באותו מספר.
בדיקת ההטמעה של ה-Observer
אם מעבירים את עיבוד הנתונים ל-thread אחר, חשוב ליצור עותקים של נתוני הסרטון.
VideoFrame.frame
הוא למעשה הפניה לנתונים הבסיסיים, ולכן ניסיון לגשת אליו אחרי OnVideoFrame
יוביל להתנהגות לא מוגדרת, כמו שגיאת פילוח.