يقدّم هذا الدليل تعليمات حول كيفية حلّ الأخطاء الشائعة في 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 لمؤسسته. في حال حدوث ذلك، لا يمكن تغيير هذا الإعداد أثناء مدة الاجتماع. لمزيد من المعلومات، يُرجى الاطّلاع على الشكل 3 في دورة حياة Meet Media API. |
DISABLED_BY_HOST_CONROL |
أوقف المضيف واجهة برمجة التطبيقات 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: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
. . .
تحديد المشاكل المتعلقة بالصوت وحلّها
يمكن أن تساعد الأقسام التالية في حلّ مشاكل الصوت في تطبيقك.
مراجعة السجلات
إذا كنت تستخدم تطبيق الويب في متصفّح 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
إلى سلوك غير محدّد، مثل خطأ تجزئة.