इस गाइड में, Google Meet Media API से जुड़ी सामान्य गड़बड़ियों को ठीक करने का तरीका बताया गया है.
गड़बड़ी कोड से जुड़ी समस्या हल करना
connectActiveConference
एंडपॉइंट से मिले गड़बड़ी कोड की समस्या हल करने के लिए, यहां सलाह दी गई है:
गड़बड़ी के कोड | |
---|---|
NO_ACTIVE_CONFERENCE |
पक्का करें कि Meet Media API क्लाइंट, मीटिंग स्पेस में कॉन्फ़्रेंस में शामिल होने के बाद ही कनेक्ट करने की कोशिश करे. |
INVALID_OFFER |
ऑफ़र की ज़रूरी शर्तें पढ़ें और देखें कि कोई जानकारी तो छूटी हुई नहीं है. जैसे, डेटा खोलने के लिए ज़रूरी चैनल. आपके पास अपने ऐप्लिकेशन की ऑफ़र स्ट्रिंग की तुलना, उदाहरण के तौर पर दिए गए ऑफ़र से करने का विकल्प भी है. साथ ही, उनमें अंतर की जांच भी की जा सकती है. |
INCOMPATIBLE_DEVICE |
कॉन्फ़्रेंस में शामिल एक या उससे ज़्यादा डिवाइस, Meet Media API क्लाइंट के साथ काम नहीं करते. आपका ऐप्लिकेशन इसमें शामिल नहीं हो पाएगा. इसलिए, आपको अपने असली उपयोगकर्ताओं को इसकी जानकारी देनी होगी. |
CONNECTIONS_EXHAUSTED |
एक बार में सिर्फ़ एक Meet Media API क्लाइंट, किसी कॉन्फ़्रेंस से कनेक्ट हो सकता है. अगर आपका ऐप्लिकेशन बंद हो जाता है, तो फिर से कनेक्ट करने की कोशिश करने पर, आपको यह गड़बड़ी दिख सकती है. इस मामले में, Meet के पिछले कनेक्शन के टाइम आउट होने के लिए करीब 30 सेकंड तक इंतज़ार करें. इसके बाद, फिर से कोशिश करें. |
यूनिफ़ाइड प्लान
अगर डेटा चैनल कभी नहीं खुलते और आपको कभी ऑडियो या वीडियो नहीं मिलता, तो देखें कि लोकल पीयर कनेक्शन को कॉन्फ़िगर करते समय, सिर्फ़ यूनिफ़ाइड प्लान का इस्तेमाल किया गया है या नहीं.
मीडिया के ब्यौरे के क्रम से जुड़ी गड़बड़ी
सेशन डिस्क्रिप्शन प्रोटोकॉल (एसडीपी) ऑफ़र की मदद से, पीयर-टू-पीयर कनेक्शन बनाते समय, आपको गड़बड़ी का यह मैसेज दिख सकता है:
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.
इसका मतलब है कि एसडीपी के जवाब में मीडिया के ब्यौरे वाली लाइनें, एसडीपी के ऑफ़र में मीडिया के ब्यौरे से मेल नहीं खाती हैं:
एसडीपी ऑफ़र | एसडीपी का जवाब |
---|---|
✅ 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 भूमिका एट्रिब्यूट सेट करते समय, आपको गड़बड़ी दिख सकती है:
All DTLS roles must be one of [ACTIVE, ACTPASS].
यह गड़बड़ी तब होती है, जब SDP ऑफ़र में सभी मीडिया डिस्क्रिप्शन के लिए a=setup:< >
एट्रिब्यूट की वैल्यू सही तरीके से सेट न की गई हो.
इस गड़बड़ी को ठीक करने के लिए, पक्का करें कि एसडीपी ऑफ़र में मौजूद हर मीडिया के ब्यौरे में, इनमें से कोई एक ज़रूरी एट्रिब्यूट मौजूद हो:
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 सिर्फ़ तब ऑडियो उपलब्ध कराता है, जब एसडीपी ऑफ़र में इसकी जानकारी दी गई हो. ऑफ़र में सिर्फ़ पाने के लिए, तीन ऑडियो मीडिया ब्यौरे होने चाहिए.
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 सर्वर को कोई मान्य ऑफ़र मिलता है, तो वे एसडीपी के जवाब के साथ जवाब देते हैं. इसमें, सिर्फ़ भेजने के लिए उपलब्ध तीन ऑडियो मीडिया की जानकारी होती है.
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
. . .
वीडियो न दिखने की समस्या हल करना
- देखें कि Meet सर्वर को भेजे गए एसडीपी ऑफ़र में
m=video …
मौजूद है या नहीं. - देखें कि
a=recvonly
हरm=video
लाइन में मौजूद एट्रिब्यूट है. - देखें कि एसडीपी के जवाब में,
m=video
लाइनों की संख्या बराबर हो. - देखें कि एसडीपी के जवाब में, हर
m=video
पंक्ति के नीचेa=sendonly
याa=sendrecv
एट्रिब्यूट हों. - देखें कि Meet के सर्वर पर
VideoAssignmentRequest
को सही तरीके से भेजा गया था और उसे सर्वर ने सही तरीके से पाया था. अनुरोध पूरा होने या न होने की जानकारी, क्लाइंट को उसी डेटा चैनल से दी जानी चाहिए.
उम्मीद से कम वीडियो स्ट्रीम होने की समस्या हल करना
- देखें कि एसडीपी ऑफ़र में
m=video …
लाइनों की सही संख्या है या नहीं. - पक्का करें कि एसडीपी के जवाब में मौजूद सभी
m=video
ब्यौरे में,a=sendonly
याa=sendrecv
एट्रिब्यूट शामिल हो. जवाब मेंa=recvonly
के तौर पर मार्क की गई हर लाइन, क्लाइंट को भेजी जाने वाली स्ट्रीम की संख्या को उतना ही कम कर देती है.
आपने ऑब्ज़र्वर को लागू किया है या नहीं, इसकी जांच करना
अगर डेटा प्रोसेसिंग को किसी दूसरी थ्रेड पर ले जाया जाता है, तो वीडियो डेटा की कॉपी बनाना न भूलें.
VideoFrame.frame
असल में, डेटा का रेफ़रंस होता है. इसलिए, OnVideoFrame
के बाद इसे ऐक्सेस करने की कोशिश करने पर, सेगमेंटेशन फ़ॉल्ट जैसा कोई गड़बड़ी का मैसेज दिख सकता है.