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