عیب‌یابی و رفع خطاهای 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 اجازه ورود به جلسه را ندارد. می‌توانید این موضوع را به کاربران نهایی خود اطلاع دهید. برای اطلاعات بیشتر، به شکل ۲ در چرخه عمر 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 111m=audio 9 UDP/TLS/RTP/SAVPF 111
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99m=audio 9 UDP/TLS/RTP/SAVPF 111
m=audio 9 UDP/TLS/RTP/SAVPF 111m=audio 9 UDP/TLS/RTP/SAVPF 111
m=audio 9 UDP/TLS/RTP/SAVPF 111m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99

برای رفع این خطا، هنگام تنظیم شیء اتصال همتا، مطمئن شوید که انواع رسانه‌های مشابه به درستی پیکربندی شده و با هم گروه‌بندی شده‌اند. توضیحات رسانه‌های درهم‌لایه پشتیبانی نمی‌شوند.

نمونه کد زیر نحوه تطبیق صحیح توضیحات رسانه را نشان می‌دهد:

سی++

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);
  // . . .
}

جاوا اسکریپت

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
. . .

عیب‌یابی مشکلات صوتی

بخش‌های زیر می‌توانند به حل مشکلات صوتی در برنامه شما کمک کنند.

لاگ‌ها را بررسی کنید

اگر از کلاینت وب در مرورگر کروم استفاده می‌کنید:

  1. یک تب جدید باز کنید و در نوار آدرس عبارت chrome://webrtc-internals را وارد کنید.
  2. به بخشی که با عنوان Stats graph for inbound-rtp مشخص شده است، بروید.
  3. هر نمودار صوتی را بررسی کنید تا ببینید آیا بسته‌ها دریافت می‌شوند یا خیر.

اگر از کلاینت مرجع C++ استفاده می‌کنید، بررسی کنید که آیا OnAudioFrame تا به حال فراخوانی شده است یا خیر.

دامنه‌های OAuth را تأیید کنید

صدا فقط در صورتی منتقل می‌شود که دامنه مناسب با درخواست اتصال اولیه ارائه شود. برای رفع خطا، مطمئن شوید که دامنه‌های صحیح OAuth 2.0 را ارائه می‌دهید. برای اطلاعات بیشتر، به دامنه‌های Meet Media API مراجعه کنید.

تأیید کنید که کنفرانس به درستی تنظیم شده است

  • وقتی کلاینت به سرورهای گوگل میت متصل می‌شود، به طور خودکار به کنفرانس راه پیدا نمی‌کند. مطمئن شوید که به‌روزرسانی منبع کنترل جلسه را از طریق کانال داده کنترل جلسه با وضعیت 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 منجر به رفتار نامشخصی مانند خطای قطعه‌بندی می‌شود.

رفع مشکلات مربوط به ویدیو

بخش‌های زیر می‌توانند به حل مشکلات ویدیویی در برنامه شما کمک کنند.

لاگ‌ها را بررسی کنید

اگر از کلاینت وب در مرورگر کروم استفاده می‌کنید:

  1. یک تب جدید باز کنید و در نوار آدرس عبارت chrome://webrtc-internals را وارد کنید.
  2. به بخشی که با عنوان Stats graph for inbound-rtp مشخص شده است، بروید.
  3. هر نمودار ویدیویی را بررسی کنید تا ببینید آیا بسته‌ها دریافت می‌شوند یا خیر.

اگر از کلاینت مرجع 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 … lines باشد.
  • مطمئن شوید که تمام توضیحات m=video در پاسخ SDP حاوی ویژگی a a=sendonly یا a=sendrecv باشند. هر خطی که در پاسخ با a=recvonly مشخص شده باشد، میزان جریان‌های ارسالی به کلاینت را به همان میزان کاهش می‌دهد.

پیاده‌سازی ناظر خود را بررسی کنید

اگر پردازش داده‌ها را به یک thread دیگر منتقل می‌کنید، حتماً از داده‌های ویدیویی کپی تهیه کنید. VideoFrame.frame در واقع یک مرجع به داده‌های زیربنایی است، بنابراین تلاش برای دسترسی به آن پس از OnVideoFrame منجر به رفتار نامشخصی مانند خطای segmentation fault خواهد شد.

،

این راهنما دستورالعمل‌هایی در مورد نحوه رفع خطاهای رایج رابط برنامه‌نویسی کاربردی رسانه‌ای گوگل میت ارائه می‌دهد.

عیب یابی کدهای خطا

در اینجا نکاتی برای عیب‌یابی کدهای خطایی که توسط نقطه پایانی 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 اجازه ورود به جلسه را ندارد. می‌توانید این موضوع را به کاربران نهایی خود اطلاع دهید. برای اطلاعات بیشتر، به شکل ۲ در چرخه عمر 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 111m=audio 9 UDP/TLS/RTP/SAVPF 111
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99m=audio 9 UDP/TLS/RTP/SAVPF 111
m=audio 9 UDP/TLS/RTP/SAVPF 111m=audio 9 UDP/TLS/RTP/SAVPF 111
m=audio 9 UDP/TLS/RTP/SAVPF 111m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99

برای رفع این خطا، هنگام تنظیم شیء اتصال همتا، مطمئن شوید که انواع رسانه‌های مشابه به درستی پیکربندی شده و با هم گروه‌بندی شده‌اند. توضیحات رسانه‌های درهم‌لایه پشتیبانی نمی‌شوند.

نمونه کد زیر نحوه تطبیق صحیح توضیحات رسانه را نشان می‌دهد:

سی++

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);
  // . . .
}

جاوا اسکریپت

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
. . .

عیب‌یابی مشکلات صوتی

بخش‌های زیر می‌توانند به حل مشکلات صوتی در برنامه شما کمک کنند.

لاگ‌ها را بررسی کنید

اگر از کلاینت وب در مرورگر کروم استفاده می‌کنید:

  1. یک تب جدید باز کنید و در نوار آدرس عبارت chrome://webrtc-internals را وارد کنید.
  2. به بخشی که با عنوان Stats graph for inbound-rtp مشخص شده است، بروید.
  3. هر نمودار صوتی را بررسی کنید تا ببینید آیا بسته‌ها دریافت می‌شوند یا خیر.

اگر از کلاینت مرجع C++ استفاده می‌کنید، بررسی کنید که آیا OnAudioFrame تا به حال فراخوانی شده است یا خیر.

دامنه‌های OAuth را تأیید کنید

صدا فقط در صورتی منتقل می‌شود که دامنه مناسب با درخواست اتصال اولیه ارائه شود. برای رفع خطا، مطمئن شوید که دامنه‌های صحیح OAuth 2.0 را ارائه می‌دهید. برای اطلاعات بیشتر، به دامنه‌های Meet Media API مراجعه کنید.

تأیید کنید که کنفرانس به درستی تنظیم شده است

  • وقتی کلاینت به سرورهای گوگل میت متصل می‌شود، به طور خودکار به کنفرانس راه پیدا نمی‌کند. مطمئن شوید که به‌روزرسانی منبع کنترل جلسه را از طریق کانال داده کنترل جلسه با وضعیت 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 منجر به رفتار نامشخصی مانند خطای قطعه‌بندی می‌شود.

رفع مشکلات مربوط به ویدیو

بخش‌های زیر می‌توانند به حل مشکلات ویدیویی در برنامه شما کمک کنند.

لاگ‌ها را بررسی کنید

اگر از کلاینت وب در مرورگر کروم استفاده می‌کنید:

  1. یک تب جدید باز کنید و در نوار آدرس عبارت chrome://webrtc-internals را وارد کنید.
  2. به بخشی که با عنوان Stats graph for inbound-rtp مشخص شده است، بروید.
  3. هر نمودار ویدیویی را بررسی کنید تا ببینید آیا بسته‌ها دریافت می‌شوند یا خیر.

اگر از کلاینت مرجع 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 … lines باشد.
  • مطمئن شوید که تمام توضیحات m=video در پاسخ SDP حاوی ویژگی a a=sendonly یا a=sendrecv باشند. هر خطی که در پاسخ با a=recvonly مشخص شده باشد، میزان جریان‌های ارسالی به کلاینت را به همان میزان کاهش می‌دهد.

پیاده‌سازی ناظر خود را بررسی کنید

اگر پردازش داده‌ها را به یک thread دیگر منتقل می‌کنید، حتماً از داده‌های ویدیویی کپی تهیه کنید. VideoFrame.frame در واقع یک مرجع به داده‌های زیربنایی است، بنابراین تلاش برای دسترسی به آن پس از OnVideoFrame منجر به رفتار نامشخصی مانند خطای segmentation fault خواهد شد.

،

این راهنما دستورالعمل‌هایی در مورد نحوه رفع خطاهای رایج رابط برنامه‌نویسی کاربردی رسانه‌ای گوگل میت ارائه می‌دهد.

عیب یابی کدهای خطا

در اینجا نکاتی برای عیب‌یابی کدهای خطایی که توسط نقطه پایانی 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 اجازه ورود به جلسه را ندارد. می‌توانید این موضوع را به کاربران نهایی خود اطلاع دهید. برای اطلاعات بیشتر، به شکل ۲ در چرخه عمر 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 111m=audio 9 UDP/TLS/RTP/SAVPF 111
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99m=audio 9 UDP/TLS/RTP/SAVPF 111
m=audio 9 UDP/TLS/RTP/SAVPF 111m=audio 9 UDP/TLS/RTP/SAVPF 111
m=audio 9 UDP/TLS/RTP/SAVPF 111m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99

برای رفع این خطا، هنگام تنظیم شیء اتصال همتا، مطمئن شوید که انواع رسانه‌های مشابه به درستی پیکربندی شده و با هم گروه‌بندی شده‌اند. توضیحات رسانه‌های درهم‌لایه پشتیبانی نمی‌شوند.

نمونه کد زیر نحوه تطبیق صحیح توضیحات رسانه را نشان می‌دهد:

سی++

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);
  // . . .
}

جاوا اسکریپت

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
. . .

عیب‌یابی مشکلات صوتی

بخش‌های زیر می‌توانند به حل مشکلات صوتی در برنامه شما کمک کنند.

لاگ‌ها را بررسی کنید

اگر از کلاینت وب در مرورگر کروم استفاده می‌کنید:

  1. یک تب جدید باز کنید و در نوار آدرس عبارت chrome://webrtc-internals را وارد کنید.
  2. به بخشی که با عنوان Stats graph for inbound-rtp مشخص شده است، بروید.
  3. هر نمودار صوتی را بررسی کنید تا ببینید آیا بسته‌ها دریافت می‌شوند یا خیر.

اگر از کلاینت مرجع C++ استفاده می‌کنید، بررسی کنید که آیا OnAudioFrame تا به حال فراخوانی شده است یا خیر.

دامنه‌های OAuth را تأیید کنید

صدا فقط در صورتی منتقل می‌شود که دامنه مناسب با درخواست اتصال اولیه ارائه شود. برای رفع خطا، مطمئن شوید که دامنه‌های صحیح OAuth 2.0 را ارائه می‌دهید. برای اطلاعات بیشتر، به دامنه‌های Meet Media API مراجعه کنید.

تأیید کنید که کنفرانس به درستی تنظیم شده است

  • وقتی کلاینت به سرورهای گوگل میت متصل می‌شود، به طور خودکار به کنفرانس راه پیدا نمی‌کند. مطمئن شوید که به‌روزرسانی منبع کنترل جلسه را از طریق کانال داده کنترل جلسه با وضعیت 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 منجر به رفتار نامشخصی مانند خطای قطعه‌بندی می‌شود.

رفع مشکلات مربوط به ویدیو

بخش‌های زیر می‌توانند به حل مشکلات ویدیویی در برنامه شما کمک کنند.

لاگ‌ها را بررسی کنید

اگر از کلاینت وب در مرورگر کروم استفاده می‌کنید:

  1. یک تب جدید باز کنید و در نوار آدرس عبارت chrome://webrtc-internals را وارد کنید.
  2. به بخشی که با عنوان Stats graph for inbound-rtp مشخص شده است، بروید.
  3. هر نمودار ویدیویی را بررسی کنید تا ببینید آیا بسته‌ها دریافت می‌شوند یا خیر.

اگر از کلاینت مرجع 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 … lines باشد.
  • مطمئن شوید که تمام توضیحات m=video در پاسخ SDP حاوی ویژگی a a=sendonly یا a=sendrecv باشند. هر خطی که در پاسخ با a=recvonly مشخص شده باشد، میزان جریان‌های ارسالی به کلاینت را به همان میزان کاهش می‌دهد.

پیاده‌سازی ناظر خود را بررسی کنید

اگر پردازش داده‌ها را به یک thread دیگر منتقل می‌کنید، حتماً از داده‌های ویدیویی کپی تهیه کنید. VideoFrame.frame در واقع یک مرجع به داده‌های زیربنایی است، بنابراین تلاش برای دسترسی به آن پس از OnVideoFrame منجر به رفتار نامشخصی مانند خطای segmentation fault خواهد شد.