يقدّم هذا الدليل تعليمات حول كيفية حلّ الأخطاء الشائعة في 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 |
يمكن لعميل واحد فقط من Meet Media API الاتصال بمكالمة فيديو في كل مرة. إذا تعذّر تشغيل تطبيقك، قد يظهر لك هذا الخطأ إذا حاول التطبيق إعادة الاتصال. في هذه الحالة، انتظِر حوالي 30 ثانية إلى أن تنتهي مهلة الاتصال السابق في Meet. ثم أعد المحاولة مرة أخرى. |
CONSENTER_ABSENT |
لا يوجد مشارك مؤهَّل في الاجتماع. بالنسبة إلى الاجتماعات التي يملكها مستهلك، تأكَّد من أنّ المنظِّم مشارك في الاجتماع. بالنسبة إلى اجتماعات مالك مساحة العمل، يجب أن يكون هناك عضو واحد على الأقل من تلك المؤسسة يملك الاجتماع. لمزيد من المعلومات، يُرجى الاطّلاع على متطلبات الموافقة. |
DISABLED_BY_ADMIN |
أوقف المشرف واجهة برمجة التطبيقات Meet Media API لمؤسسته. في حال حدوث ذلك، لا يمكن تغيير هذا الإعداد أثناء مدة الاجتماع. لمزيد من المعلومات، يُرجى الاطّلاع على الشكل 3 في دورة حياة Meet Media API. |
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. |
خطة موحَّدة
إذا لم يتم فتح قنوات البيانات مطلقًا ولم تتلقَّ أي صوت أو فيديو، تأكَّد من أنّه يتم استخدام الخطة الموحّدة فقط عند إعداد اتصال الند للند المحلي.
خطأ في ترتيب وصف الوسائط
عند إنشاء اتصال من نظير إلى نظير باستخدام عرض بروتوكول وصف الجلسة (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
. . .
التحقّق من عملية تنفيذ المراقب
احرص على إنشاء نُسخ من البيانات الصوتية إذا نقلت معالجة البيانات إلى سلسلة محادثات مختلفة.
إنّ 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عليها في الإجابة تقلل من عدد عمليات البث التي يتم إرسالها إلى العميل بهذا المقدار.
التحقّق من عملية تنفيذ المراقب
احرص على إنشاء نُسخ من بيانات الفيديو إذا نقلت معالجة البيانات إلى سلسلة محادثات مختلفة.
VideoFrame.frame
هو في الواقع مرجع إلى البيانات الأساسية، لذا ستؤدي محاولة الوصول إليه بعد
OnVideoFrame
إلى سلوك غير محدّد، مثل خطأ تجزئة.