WebRTC, एक खुले और सुरक्षित वेब के लिए इस लंबे युद्ध का एक नया ढांचा है.
ब्रेंडन आइच, JavaScript के आविष्कारक
प्लगिन के बिना रीयल-टाइम में बातचीत करना
कल्पना करें कि एक ऐसी दुनिया हो जाए, जहां आपका फ़ोन, टीवी, और कंप्यूटर एक ही प्लैटफ़ॉर्म पर बातचीत कर सकें. मान लें कि आपके वेब ऐप्लिकेशन में वीडियो चैट और पीयर-टू-पीयर डेटा शेयर करना आसान था. WebRTC का यही विज़न है.
क्या आप इसे आज़माना है? WebRTC, डेस्कटॉप और मोबाइल पर Google Chrome, Safari, Firefox, और Opera में उपलब्ध है. शुरू करने के लिए एक सामान्य वीडियो चैट ऐप्लिकेशन appr.tc है:
- अपने ब्राउज़र में appr.tc खोलें.
- चैट रूम में शामिल होने और ऐप्लिकेशन को वेबकैम का इस्तेमाल करने की अनुमति देने के लिए, शामिल हों पर क्लिक करें.
- पेज के आखिर में दिखाए गए यूआरएल को नए टैब में खोलें या किसी दूसरे कंप्यूटर पर खोलें.
तुरंत शुरू करना
क्या आपके पास इस लेख को पढ़ने का समय नहीं है या आपको सिर्फ़ कोड चाहिए?
- WebRTC की खास जानकारी पाने के लिए, नीचे दिया गया Google I/O वीडियो देखें या ये स्लाइड देखें:
- अगर आपने
getUserMedia
एपीआई का इस्तेमाल नहीं किया है, तो HTML5 में ऑडियो और वीडियो कैप्चर करें और simpl.info getUserMedia देखें. RTCPeerConnection
एपीआई के बारे में जानने के लिए, नीचे दिया गया उदाहरण और 'simpl.info RTCPeerConnection' देखें.- यह जानने के लिए कि WebRTC, सिग्नल, फ़ायरवॉल और NAT ट्रैवर्सल के लिए सर्वर का इस्तेमाल कैसे करता है, appr.tc से कोड और कंसोल लॉग देखें.
- इंतज़ार नहीं कर सकते और अभी WebRTC को आज़माना चाहते हैं? WebRTC JavaScript API का इस्तेमाल करने वाले 20 से ज़्यादा डेमो में से कुछ आज़माएं.
- आपकी मशीन और WebRTC में समस्या है? WebRTC समस्या हल करने वाले टूल पर जाएं.
इसके अलावा, सीधे WebRTC कोडलैब पर जाएं. यहां सिलसिलेवार तरीके से निर्देश दिए गए हैं. इसमें एक आसान सिग्नलिंग सर्वर के साथ पूरा वीडियो चैट ऐप्लिकेशन बनाने का तरीका बताया गया है.
WebRTC का बहुत छोटा इतिहास
लोगों के साथ वॉइस और वीडियो के ज़रिए बातचीत करना, वेब के लिए आखिरी बड़ी चुनौतियों में से एक है: रीयल-टाइम कम्यूनिकेशन या कम शब्दों में आरटीसी. आरटीसी, किसी वेब ऐप्लिकेशन में उतना ही आसान होना चाहिए जितना कि किसी टेक्स्ट इनपुट में टेक्स्ट डालना होता है. इसके बिना, आप लोगों से बातचीत करने के लिए, कुछ नया कर पाएंगे और नए तरीके नहीं बना पाएंगे.
पहले, आरटीसी कॉर्पोरेट और जटिल रहा है. यहां ऑडियो और वीडियो टेक्नोलॉजी के लिए महंगी लाइसेंस लेने की ज़रूरत होती है या इन्हें खुद डेवलप करना होता है. आरटीसी टेक्नोलॉजी को मौजूदा कॉन्टेंट, डेटा, और सेवाओं के साथ इंटिग्रेट करना मुश्किल है. इसमें काफ़ी समय भी लगता है, खास तौर पर वेब पर.
Gmail वीडियो चैट 2008 में लोकप्रिय हुआ और, 2011 में, Google ने Hangouts की शुरुआत की, जो Talk (Gmail की तरह ही) का उपयोग करता है. Google ने GIPS को खरीदा, जो एक ऐसी कंपनी थी जिसने आरटीसी के लिए ज़रूरी कई कॉम्पोनेंट डेवलप किए थे, जैसे कि कोडेक और इको रद्द करने की तकनीकें. Google ने GIPS की बनाई टेक्नोलॉजी को ओपन सोर्स किया है. साथ ही, इसे इंडस्ट्री की सहमति पक्का करने के लिए, इंटरनेट इंजीनियरिंग टास्क फ़ोर्स (आईईटीएफ़) और वर्ल्ड वाइड वेब कंसोर्टियम (W3C) के लिए, संबंधित स्टैंडर्ड के निकायों के साथ जोड़ा. मई 2011 में, एरिकसन ने WebRTC को पहली बार लागू किया.
WebRTC ने रीयल-टाइम, प्लगिन-फ़्री वीडियो, ऑडियो, और डेटा कम्यूनिकेशन के लिए ओपन स्टैंडर्ड लागू किए. असल ज़रूरत थी:
- कई वेब सेवाओं ने आरटीसी का इस्तेमाल किया है, लेकिन उन्हें डाउनलोड, खास ऐप्लिकेशन या प्लगिन की ज़रूरत पड़ी. इनमें Skype, Facebook, और Hangouts शामिल हैं.
- प्लगिन को डाउनलोड, इंस्टॉल, और अपडेट करना मुश्किल होता है. साथ ही, इनमें गड़बड़ी होने की आशंका और परेशानी होती है.
- प्लगिन को डिप्लॉय करना, डीबग करना, समस्या हल करना, उनकी जांच करना, और उनका रखरखाव करना मुश्किल होता है. इसके लिए, आपको जटिल और महंगी टेक्नोलॉजी के लिए लाइसेंस लेने और इंटिग्रेशन की ज़रूरत पड़ सकती है. अक्सर लोगों को पहली बार प्लगिन इंस्टॉल करने के लिए राज़ी करना मुश्किल होता है!
WebRTC प्रोजेक्ट के दिशा-निर्देश यह है कि इसके एपीआई ओपन सोर्स, मुफ़्त, मानक वाले, वेब ब्राउज़र में बने होने चाहिए, और मौजूदा टेक्नोलॉजी से ज़्यादा कुशल होने चाहिए.
अब हम कहां हैं?
WebRTC का इस्तेमाल कई ऐप्लिकेशन में किया जाता है, जैसे कि Google Meet. WebRTC को WebKitGTK+ और Qt नेटिव ऐप्लिकेशन के साथ भी इंटिग्रेट किया गया है.
WebRTC इन तीन एपीआई को लागू करता है:
- MediaStream
(getUserMedia
के नाम से भी जाना जाता है)
- RTCPeerConnection
- RTCDataChannel
एपीआई की जानकारी इन दो खास बातों में दी गई है:
ये तीनों एपीआई, मोबाइल और डेस्कटॉप पर Chrome, Safari, Firefox, Edge, और Opera पर काम करते हैं.
getUserMedia
: डेमो और कोड के लिए, WebRTC नमूने देखें या क्रिस विल्सन के शानदार उदाहरण आज़माएं, जिनमें वेब ऑडियो के इनपुट के तौर पर getUserMedia
का इस्तेमाल किया गया है.
RTCPeerConnection
: सामान्य डेमो और पूरी तरह से काम करने वाले वीडियो चैट ऐप्लिकेशन के लिए, क्रम से WebRTC नमूना पीयर कनेक्शन और appr.tc देखें. यह ऐप्लिकेशन, adapter.js का इस्तेमाल करता है. यह एक JavaScript शिम होता है. इसे Google मैनेज करता है. इसके लिए, यह WebRTC कम्यूनिटी की मदद लेता है. इससे ब्राउज़र के अंतर और खास जानकारी में हुए बदलावों को हटाया जा सकता है.
RTCDataChannel
: इसे इस्तेमाल करने का तरीका जानने के लिए, WebRTC सैंपल देखें. इससे कोई एक डेटा चैनल डेमो देखा जा सकता है.
WebRTC कोडलैब वीडियो चैट और फ़ाइल शेयर करने के लिए एक आसान ऐप्लिकेशन बनाने के लिए, तीनों एपीआई का इस्तेमाल करने का तरीका बताता है.
आपका पहला WebRTC
WebRTC ऐप्लिकेशन को कई काम करने होंगे:
- स्ट्रीमिंग ऑडियो, वीडियो या अन्य डेटा पाएं.
- नेटवर्क की जानकारी पाएं, जैसे कि आईपी पते और पोर्ट. साथ ही, एनएटी और फ़ायरवॉल के ज़रिए भी कनेक्शन चालू करने के लिए, इसे अन्य WebRTC क्लाइंट (जिन्हें पीयर कहा जाता है) के साथ एक्सचेंज करें.
- गड़बड़ियों की रिपोर्ट करने और सेशन शुरू या बंद करने के लिए, सिग्नलिंग कम्यूनिकेशन को सिंक करें.
- मीडिया और क्लाइंट की क्षमता, जैसे कि रिज़ॉल्यूशन और कोडेक के बारे में जानकारी का लेन-देन करें.
- स्ट्रीमिंग ऑडियो, वीडियो या डेटा स्ट्रीम करना.
स्ट्रीमिंग डेटा पाने और उसे लोगों तक पहुंचाने के लिए, WebRTC ये एपीआई लागू करता है:
MediaStream
को उपयोगकर्ता के कैमरे और माइक्रोफ़ोन जैसी डेटा स्ट्रीम का ऐक्सेस मिलता है.RTCPeerConnection
, एन्क्रिप्शन और बैंडविथ मैनेजमेंट की सुविधाओं के साथ ऑडियो या वीडियो कॉलिंग की सुविधा देता है.RTCDataChannel
, सामान्य डेटा के लिए पीयर-टू-पीयर कम्यूनिकेशन की सुविधा देता है.
(इसके बाद, WebRTC के नेटवर्क और सिग्नल से जुड़े पहलुओं के बारे में चर्चा की गई है.)
MediaStream
एपीआई (इसे getUserMedia
एपीआई भी कहा जाता है)
MediaStream
एपीआई, मीडिया की सिंक की गई स्ट्रीम दिखाता है. उदाहरण के लिए, कैमरे और माइक्रोफ़ोन इनपुट से ली गई स्ट्रीम में वीडियो और ऑडियो ट्रैक सिंक किए गए हैं. (MediaStreamTrack
और <track>
एलिमेंट के बीच अंतर न करें. यह एलिमेंट पूरी तरह से अलग है.
MediaStream
एपीआई को समझने का सबसे आसान तरीका यह है कि इसे जंगल में देखा जा सकता है:
- अपने ब्राउज़र में, WebRTC सैंपल
getUserMedia
पर जाएं. - कंसोल खोलें.
- ग्लोबल स्कोप में शामिल
stream
वैरिएबल की जांच करें.
हर MediaStream
में एक इनपुट होता है, जो getUserMedia()
से जनरेट किया गया MediaStream
हो सकता है. साथ ही, एक आउटपुट हो सकता है जिसे किसी वीडियो एलिमेंट या RTCPeerConnection
को भेजा जा सकता है.
getUserMedia()
वाला तरीका, MediaStreamConstraints
ऑब्जेक्ट पैरामीटर लेता है और MediaStream
ऑब्जेक्ट के बारे में बताने वाला Promise
दिखाता है.
हर MediaStream
का एक label
होता है, जैसे कि 'Xk7EuLhsuHKbnjLWkW4yYGNJJ8ONsgwHBvLQ'
. MediaStreamTrack
की कैटगरी दिखाने के लिए, getAudioTracks()
और getVideoTracks()
तरीके इस्तेमाल किए जाते हैं.
getUserMedia
के उदाहरण के लिए, stream.getAudioTracks()
एक खाली अरे दिखाता है, क्योंकि इसमें कोई ऑडियो नहीं है. यह मानते हुए कि काम कर रहा वेबकैम कनेक्ट है, तो stream.getVideoTracks()
, वेबकैम से स्ट्रीम को दिखाने वाले MediaStreamTrack
का अरे दिखाता है. हर MediaStreamTrack
का एक फ़ॉर्मैट ('video'
या 'audio'
) और label
('FaceTime HD Camera (Built-in)'
जैसा कुछ) होता है. यह ऑडियो या वीडियो के एक या इससे ज़्यादा चैनलों के बारे में बताता है. इस मामले में, सिर्फ़ एक वीडियो ट्रैक उपलब्ध है और ऑडियो नहीं है. हालांकि, अलग-अलग तरह के इस्तेमाल के उदाहरणों की कल्पना करना आसान है. उदाहरण के लिए, ऐसा चैट ऐप्लिकेशन जो फ़्रंट कैमरे, पीछे वाले कैमरे, माइक्रोफ़ोन से स्ट्रीम करता हो, और स्क्रीन शेयर करने वाला ऐप्लिकेशन.
srcObject
एट्रिब्यूट को सेट करके, MediaStream
को वीडियो एलिमेंट में अटैच किया जा सकता है. पहले, URL.createObjectURL()
की मदद से बनाए गए ऑब्जेक्ट यूआरएल पर src
एट्रिब्यूट को सेट करके ऐसा किया गया था. हालांकि, इसका अब इस्तेमाल नहीं किया जा रहा है.
getUserMedia
का इस्तेमाल, Web Audio API के लिए इनपुट नोड के तौर पर भी किया जा सकता है:
// Cope with browser differences.
let audioContext;
if (typeof AudioContext === 'function') {
audioContext = new AudioContext();
} else if (typeof webkitAudioContext === 'function') {
audioContext = new webkitAudioContext(); // eslint-disable-line new-cap
} else {
console.log('Sorry! Web Audio not supported.');
}
// Create a filter node.
var filterNode = audioContext.createBiquadFilter();
// See https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#BiquadFilterNode-section
filterNode.type = 'highpass';
// Cutoff frequency. For highpass, audio is attenuated below this frequency.
filterNode.frequency.value = 10000;
// Create a gain node to change audio volume.
var gainNode = audioContext.createGain();
// Default is 1 (no change). Less than 1 means audio is attenuated
// and vice versa.
gainNode.gain.value = 0.5;
navigator.mediaDevices.getUserMedia({audio: true}, (stream) => {
// Create an AudioNode from the stream.
const mediaStreamSource =
audioContext.createMediaStreamSource(stream);
mediaStreamSource.connect(filterNode);
filterNode.connect(gainNode);
// Connect the gain node to the destination. For example, play the sound.
gainNode.connect(audioContext.destination);
});
Chromium पर आधारित ऐप्लिकेशन और एक्सटेंशन में, getUserMedia
को भी शामिल किया जा सकता है. मेनिफ़ेस्ट में audioCapture
और/या videoCapture
अनुमतियां जोड़ने से, इंस्टॉल करने के बाद सिर्फ़ एक बार अनुरोध की जा सकती है और अनुमति मिल जाती है. इसके बाद, उपयोगकर्ता से कैमरा या माइक्रोफ़ोन ऐक्सेस करने की अनुमति नहीं मांगी जाती.
getUserMedia()
के लिए, सिर्फ़ एक बार अनुमति मिलना ज़रूरी है. पहली बार, ब्राउज़र के इंफ़ोबार में 'अनुमति दें' बटन दिखता है. Chrome ने 2015 के आखिर में getUserMedia()
के लिए एचटीटीपी ऐक्सेस को रोक दिया था, क्योंकि इसे दमदार सुविधा की कैटगरी में रखा गया था.
इसका मकसद सिर्फ़ कैमरे या माइक्रोफ़ोन के साथ-साथ, किसी भी स्ट्रीमिंग डेटा सोर्स के लिए MediaStream
चालू करना है. यह सेव किए गए डेटा या सेंसर या दूसरे इनपुट जैसे आर्बिट्रेरी डेटा सोर्स से स्ट्रीमिंग चालू कर देगा.
getUserMedia()
, अन्य JavaScript API और लाइब्रेरी के साथ मिलकर काम करने लगता है:
- Webcam Toy एक फ़ोटोबूथ ऐप्लिकेशन है. यह WebGL का इस्तेमाल करके उन फ़ोटो में अजीब और शानदार इफ़ेक्ट जोड़ता है जिन्हें डिवाइस से शेयर या सेव किया जा सकता है.
- FaceKat, चेहरे को ट्रैक करने वाला एक गेम है. इसे headtrackr.js की मदद से बनाया गया है.
- ASCII कैमरा, ASCII इमेज जनरेट करने के लिए कैनवस एपीआई का इस्तेमाल करता है.
कंस्ट्रेंट
कंस्ट्रेंट का इस्तेमाल, getUserMedia()
के लिए वीडियो रिज़ॉल्यूशन की वैल्यू सेट करने के लिए किया जा सकता है. इसमें अन्य पाबंदियां भी काम करती हैं, जैसे कि आसपेक्ट रेशियो (लंबाई-चौड़ाई का अनुपात); फ़ेसिंग मोड (सामने या पीछे का कैमरा); फ़्रेम रेट, ऊंचाई, और चौड़ाई; और एक applyConstraints()
तरीका.
उदाहरण के लिए, WebRTC सैंपल getUserMedia
: चुनें रिज़ॉल्यूशन देखें.
अस्वीकार की गई कंस्ट्रेंट वैल्यू को सेट करने से, DOMException
या OverconstrainedError
मिलता है. उदाहरण के लिए, अनुरोध किया गया रिज़ॉल्यूशन उपलब्ध नहीं होता. इसे इस्तेमाल करने का तरीका जानने के लिए, डेमो के लिए WebRTC सैंपल getUserMedia
: रिज़ॉल्यूशन चुनें देखें.
स्क्रीन और टैब कैप्चर
Chrome ऐप्लिकेशन की मदद से, chrome.tabCapture
और chrome.desktopCapture
एपीआई की मदद से, किसी एक ब्राउज़र टैब या पूरे डेस्कटॉप का लाइव वीडियो शेयर किया जा सकता है. (डेमो और ज़्यादा जानकारी के लिए, WebRTC के साथ स्क्रीन शेयर करना देखें. यह लेख कुछ साल पुराना है, लेकिन यह अब भी दिलचस्प है.)
एक्सपेरिमेंटल chromeMediaSource
कंस्ट्रेंट का इस्तेमाल करके, Chrome में MediaStream
सोर्स के तौर पर स्क्रीन कैप्चर का इस्तेमाल भी किया जा सकता है. ध्यान दें कि स्क्रीन कैप्चर के लिए एचटीटीपीएस ज़रूरी है. साथ ही, इसका इस्तेमाल सिर्फ़ डेवलपमेंट के लिए किया जाना चाहिए. ऐसा इसलिए, क्योंकि इसे कमांड-लाइन फ़्लैग की मदद से चालू किया जाता है, जैसा कि इस पोस्ट में बताया गया है.
सिग्नलिंग: सेशन कंट्रोल, नेटवर्क, और मीडिया की जानकारी
WebRTC, RTCPeerConnection
का इस्तेमाल अलग-अलग ब्राउज़र के बीच स्ट्रीमिंग डेटा (जिसे पीयर भी कहा जाता है) करने के लिए करता है. हालांकि, इसे एक-दूसरे से कनेक्ट करने और कंट्रोल मैसेज भेजने के लिए भी एक सिस्टम की ज़रूरत होती है. इस प्रोसेस को सिग्नलिंग भी कहा जाता है. सिग्नलिंग के तरीके और प्रोटोकॉल, WebRTC के ज़रिए तय नहीं किए जाते. सिग्नलिंग, RTCPeerConnection
एपीआई का हिस्सा नहीं है.
इसके बजाय, WebRTC ऐप्लिकेशन डेवलपर अपनी पसंद का मैसेज सेवा प्रोटोकॉल चुन सकते हैं, जैसे कि SIP या XMPP और कोई भी सही डूप्लेक्स (टू-वे) कम्यूनिकेशन चैनल. appr.tc के उदाहरण में, सिग्नल देने के तरीके के तौर पर XHR और Channel API का इस्तेमाल किया जाता है. codelab, नोड सर्वर पर चलने वाले Socket.io का इस्तेमाल करता है.
सिग्नल का इस्तेमाल तीन तरह की जानकारी के लेन-देन के लिए किया जाता है:
- सेशन कंट्रोल मैसेज: कम्यूनिकेशन को शुरू या बंद करने और गड़बड़ियों की शिकायत करने के लिए.
- नेटवर्क कॉन्फ़िगरेशन: बाहरी दुनिया में, आपके कंप्यूटर का आईपी पता और पोर्ट क्या है?
- मीडिया क्षमताएं: आपके ब्राउज़र और जिस ब्राउज़र से वह संचार करना चाहता है उसके द्वारा कौन से कोडेक और रिज़ॉल्यूशन प्रबंधित किए जा सकते हैं?
पीयर-टू-पीयर स्ट्रीमिंग शुरू करने से पहले, सिग्नल के ज़रिए जानकारी का लेन-देन सही तरीके से पूरा होना चाहिए.
उदाहरण के लिए, मान लीजिए कि ऐलिस, बॉब के साथ बातचीत करना चाहती हैं. यहां W3C WebRTC स्पेसिफ़िकेशन से कोड का सैंपल दिया गया है. इसमें सिग्नल देने की प्रोसेस को दिखाया गया है. यह कोड, createSignalingChannel()
तरीके में बनाए गए कुछ सिग्नलिंग सिस्टम की मौजूदगी को मानता है. यह भी ध्यान रखें कि Chrome और Opera पर, फ़िलहाल RTCPeerConnection
का प्रीफ़िक्स लगा है.
// handles JSON.stringify/parse
const signaling = new SignalingChannel();
const constraints = {audio: true, video: true};
const configuration = {iceServers: [{urls: 'stun:stun.example.org'}]};
const pc = new RTCPeerConnection(configuration);
// Send any ice candidates to the other peer.
pc.onicecandidate = ({candidate}) => signaling.send({candidate});
// Let the "negotiationneeded" event trigger offer generation.
pc.onnegotiationneeded = async () => {
try {
await pc.setLocalDescription(await pc.createOffer());
// Send the offer to the other peer.
signaling.send({desc: pc.localDescription});
} catch (err) {
console.error(err);
}
};
// Once remote track media arrives, show it in remote video element.
pc.ontrack = (event) => {
// Don't set srcObject again if it is already set.
if (remoteView.srcObject) return;
remoteView.srcObject = event.streams[0];
};
// Call start() to initiate.
async function start() {
try {
// Get local stream, show it in self-view, and add it to be sent.
const stream =
await navigator.mediaDevices.getUserMedia(constraints);
stream.getTracks().forEach((track) =>
pc.addTrack(track, stream));
selfView.srcObject = stream;
} catch (err) {
console.error(err);
}
}
signaling.onmessage = async ({desc, candidate}) => {
try {
if (desc) {
// If you get an offer, you need to reply with an answer.
if (desc.type === 'offer') {
await pc.setRemoteDescription(desc);
const stream =
await navigator.mediaDevices.getUserMedia(constraints);
stream.getTracks().forEach((track) =>
pc.addTrack(track, stream));
await pc.setLocalDescription(await pc.createAnswer());
signaling.send({desc: pc.localDescription});
} else if (desc.type === 'answer') {
await pc.setRemoteDescription(desc);
} else {
console.log('Unsupported SDP type.');
}
} else if (candidate) {
await pc.addIceCandidate(candidate);
}
} catch (err) {
console.error(err);
}
};
पहला, ऐलिस और बॉब नेटवर्क की जानकारी का लेन-देन करते हैं. (उम्मीदवार ढूंढने का एक्सप्रेशन, ICE फ़्रेमवर्क का इस्तेमाल करके, नेटवर्क इंटरफ़ेस और पोर्ट ढूंढने की प्रोसेस को दिखाता है.)
- ऐलिस,
onicecandidate
हैंडलर की मदद से एकRTCPeerConnection
ऑब्जेक्ट बनाती हैं, जो नेटवर्क कैंडिडेट उपलब्ध होने पर चलता है. - ऐलिस किसी भी सिग्नलिंग चैनल, जैसे WebSocket या किसी दूसरे तरीके का इस्तेमाल करके, बॉब को उम्मीदवारों का डेटा भेजती हैं.
- जब बॉब को ऐलिस से किसी उम्मीदवार का मैसेज मिलता है, तो वे
addIceCandidate
को कॉल करते हैं, ताकि वे उस उम्मीदवार के बारे में, रिमोट पीयर ब्यौरे में जोड़ सकें.
WebRTC क्लाइंट (जिन्हें पीयर भी कहा जाता है या इस उदाहरण में, ऐलिस और बॉब भी कहा जाता है) को भी लोकल और रिमोट ऑडियो और वीडियो मीडिया की जानकारी की जानकारी पाने और उसे एक्सचेंज करने की ज़रूरत होगी. जैसे, रिज़ॉल्यूशन और कोडेक से जुड़ी जानकारी. मीडिया कॉन्फ़िगरेशन की जानकारी का लेन-देन करने के लिए, सेशन ब्यौरे प्रोटोकॉल (एसडीपी) का इस्तेमाल करके ऑफ़र और जवाब दिया जाता है:
- ऐलिस,
RTCPeerConnection
createOffer()
तरीके का इस्तेमाल करती हैं. इसके ज़रिए रिटर्न,RTCSessionDescription
- ऐलिस के लोकल सेशन की जानकारी के साथ पास किया जाता है. - कॉलबैक में, ऐलिस
setLocalDescription()
का इस्तेमाल करके लोकल जानकारी सेट करती हैं. इसके बाद, वह अपने सिग्नलिंग चैनल के ज़रिए बॉब को सेशन की यह जानकारी भेजती हैं. ध्यान दें कि जब तकsetLocalDescription()
को कॉल नहीं किया जाता, तब तकRTCPeerConnection
उम्मीदवारों को इकट्ठा नहीं करेगा. इसे जेएसईपी आईईटीएफ़ ड्राफ़्ट में कोड किया गया है. - बॉब ने
setRemoteDescription()
का इस्तेमाल करके, उस ब्यौरे को सेट किया जिसे ऐलिस ने रिमोट ब्यौरे के तौर पर भेजा था. - बॉब,
RTCPeerConnection
createAnswer()
तरीके का इस्तेमाल करते हैं और इसे ऐलिस से मिले रिमोट ब्यौरे को पास करते हैं, ताकि उनके साथ काम करने के लिए लोकल सेशन जनरेट किया जा सके.createAnswer()
कॉलबैक कोRTCSessionDescription
पास किया जाता है. बॉब उसे स्थानीय ब्यौरे के तौर पर सेट करता है और उसे ऐलिस को भेजता है. - जब ऐलिस को वैभव के सेशन की जानकारी मिलती है, तो वे
setRemoteDescription
की मदद से उसे रिमोट जानकारी के तौर पर सेट करती हैं. - पिंग करें!
RTCSessionDescription
ऑब्जेक्ट, ब्लॉब होते हैं, जो सेशन ब्यौरा प्रोटोकॉल, एसडीपी के मुताबिक होते हैं. क्रम के हिसाब से, SDP ऑब्जेक्ट इस तरह दिखता है:
v=0
o=- 3883943731 1 IN IP4 127.0.0.1
s=
t=0 0
a=group:BUNDLE audio video
m=audio 1 RTP/SAVPF 103 104 0 8 106 105 13 126
// ...
a=ssrc:2223794119 label:H4fjnMzxy3dPIgQ7HxuCTLb4wLLLeRHnFxh810
नेटवर्क और मीडिया की जानकारी एक साथ हासिल की जा सकती है और उसका लेन-देन एक साथ किया जा सकता है. हालांकि, मिलते-जुलते ऐप्लिकेशन के बीच ऑडियो और वीडियो स्ट्रीमिंग शुरू होने से पहले, दोनों प्रोसेस पूरी होनी चाहिए.
पहले बताए गए ऑफ़र/जवाब आर्किटेक्चर को JavaScript सेशन इस्टैब्लिशमेंट प्रोटोकॉल या जेएसईपी कहा जाता है. (इसके पहले WebRTC लागू करने के लिए, Ericsson के डेमो वीडियो में, सिग्नल और स्ट्रीमिंग की प्रोसेस को एक बेहतरीन ऐनिमेशन से समझाया गया है.)
सिग्नलिंग की प्रोसेस पूरी हो जाने के बाद, कॉलर और कॉली के बीच सीधे पीयर-टू-पीयर डेटा स्ट्रीम किया जा सकता है. अगर ऐसा नहीं हो पाता है, तो किसी मध्यस्थ रिले सर्वर की मदद से डेटा को स्ट्रीम किया जा सकता है (इसके बारे में ज़्यादा जानकारी बाद में दी जाएगी). स्ट्रीमिंग RTCPeerConnection
का काम है.
RTCPeerConnection
RTCPeerConnection
WebRTC घटक है जो पीयर के बीच स्ट्रीमिंग डेटा के स्थिर और कुशल संचार को संभालता है.
नीचे दिए गए WebRTC आर्किटेक्चर डायग्राम में, RTCPeerConnection
की भूमिका को दिखाया गया है. जैसा कि आपने देखा होगा कि हरे रंग के हिस्से जटिल होते हैं!
JavaScript के हिसाब से, इस डायग्राम को समझने वाली मुख्य बात यह है कि RTCPeerConnection
, वेब डेवलपर को नीचे दिखने वाली अनगिनत मुश्किलों से बचाता है. WebRTC द्वारा उपयोग किए जाने वाले कोडेक और प्रोटोकॉल रीयल-टाइम संचार को संभव बनाने के लिए बहुत बड़ा काम करते हैं, भले ही वे गैर-भरोसेमंद नेटवर्क पर हों:
- पैकेट-लॉस छिपाना
- इको रद्द करने की सुविधा
- बैंडविथ के हिसाब से काम करने की सुविधा
- गतिशील जिटर बफ़रिंग
- आवाज़ को अपने आप नियंत्रित करने की सेटिंग
- शोर कम करने और दबाने की सुविधा
- इमेज से इमेज हटाना
पिछले W3C कोड में, सिग्नलिंग के तौर पर WebRTC का आसान उदाहरण दिखाया गया है. दो WebRTC ऐप्लिकेशन के लिए, सिलसिलेवार तरीके से निर्देश नीचे दिए गए हैं. पहला आसान उदाहरण, जिसमें RTCPeerConnection
के बारे में बताया गया है. दूसरा उदाहरण, पूरी तरह से काम करने वाला वीडियो चैट क्लाइंट है.
सर्वर के बिना RTCPeerConnection
नीचे दिया गया कोड WebRTC सैंपल पीयर कनेक्शन से लिया गया है. इसमें एक वेब पेज पर लोकल और रिमोट RTCPeerConnection
(और लोकल और रिमोट वीडियो) होता है. इसमें कोई बहुत काम की चीज़ नहीं है - कॉलर और कॉली, दोनों एक ही पेज पर हैं - हालांकि, इससे RTCPeerConnection
API के काम करने का तरीका थोड़ा आसान हो जाता है. इसकी वजह यह है कि पेज पर मौजूद RTCPeerConnection
ऑब्जेक्ट, इंटरमीडियरी सिग्नलिंग के तरीकों का इस्तेमाल किए बिना सीधे डेटा और मैसेज का लेन-देन कर सकते हैं.
इस उदाहरण में, pc1
स्थानीय पीयर (कॉलर) को दिखाता है और pc2
रिमोट पीयर (कॉलर) को दिखाता है.
कॉल करने वाले
- एक नया
RTCPeerConnection
बनाएं औरgetUserMedia()
से स्ट्रीम जोड़ें: ```js // Servers एक वैकल्पिक कॉन्फ़िगरेशन फ़ाइल है. (बाद में 'टर्न' और 'एसटीएन' के बारे में चर्चा देखें.) pc1 = नया RTCPeerConnection(सर्वर); // ... localStream.getTracks().forEach((track) => { pc1.addTrack(track, localStream); });
- कोई ऑफ़र बनाएं और उसे
pc1
के लिए स्थानीय ब्यौरे के तौर पर औरpc2
के लिए रिमोट ब्यौरे के तौर पर सेट करें. सिग्नल का इस्तेमाल किए बिना, सीधे कोड में ऐसा किया जा सकता है, क्योंकि कॉल करने वाला (कॉलर) और कॉल करने वाला (कॉलर) दोनों एक ही पेज पर होते हैं:js pc1.setLocalDescription(desc).then(() => { onSetLocalSuccess(pc1); }, onSetSessionDescriptionError ); trace('pc2 setRemoteDescription start'); pc2.setRemoteDescription(desc).then(() => { onSetRemoteSuccess(pc2); }, onSetSessionDescriptionError );
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
कैली
pc2
बनाएं औरpc1
से स्ट्रीम जुड़ने पर, इसे किसी वीडियो एलिमेंट में दिखाएं:js pc2 = new RTCPeerConnection(servers); pc2.ontrack = gotRemoteStream; //... function gotRemoteStream(e){ vid2.srcObject = e.stream; }
RTCPeerConnection
एपीआई प्लस सर्वर
असल दुनिया में, WebRTC को सर्वर की ज़रूरत होती है. हालांकि, यह आसान होता है. इसलिए, ऐसा हो सकता है कि:
- लोग एक-दूसरे को खोजते हैं और असल दुनिया की जानकारी शेयर करते हैं, जैसे कि नाम.
- WebRTC क्लाइंट ऐप्लिकेशन (मिलते-जुलते ऐप्लिकेशन), नेटवर्क की जानकारी का लेन-देन करते हैं.
- मिलते-जुलते ऐप्लिकेशन से, वीडियो का फ़ॉर्मैट और रिज़ॉल्यूशन जैसे मीडिया के बारे में डेटा शेयर किया जाता है.
- WebRTC क्लाइंट ऐप्लिकेशन, NAT गेटवे और फ़ायरवॉल का पता लगाते हैं.
दूसरे शब्दों में, WebRTC को चार तरह के सर्वर साइड फ़ंक्शन की ज़रूरत होती है:
- उपयोगकर्ता को खोजने और बातचीत करने के लिए
- सिग्नलिंग
- एनएटी/फ़ायरवॉल ट्रैवर्सल
- पीयर-टू-पीयर कम्यूनिकेशन विफल हो जाने पर सर्वर रिले करें
NAT ट्रैवर्सल, पीयर-टू-पीयर नेटवर्किंग, और उपयोगकर्ता की खोज और सिग्नलिंग के लिए सर्वर ऐप्लिकेशन बनाने की ज़रूरी शर्तें इस लेख में नहीं दी गई हैं. यह कहना सही है कि ICE फ़्रेमवर्क, STUN प्रोटोकॉल और उसके एक्सटेंशन का इस्तेमाल करता है. इससे, RTCPeerConnection
को NAT ट्रैवर्सल और नेटवर्क की अन्य गड़बड़ियों से निपटने में मदद मिलती है.
ICE एक फ़्रेमवर्क है, जो अपने साथियों को कनेक्ट करता है. जैसे, दो वीडियो चैट क्लाइंट. शुरुआत में, ICE, यूडीपी के ज़रिए अपने साथियों को सीधे कनेक्ट करने की कोशिश करता है. हालांकि, इंतज़ार का समय कम से कम होता है. इस प्रक्रिया में, STUN सर्वर का एक ही काम होता है: NAT के पीछे के साथी को, उसका सार्वजनिक पता और पोर्ट का पता लगाने में मदद करना. (STUN और TURN के बारे में ज़्यादा जानकारी के लिए, WebRTC ऐप्लिकेशन के लिए ज़रूरी बैकएंड सेवाएं बनाना देखें.)
अगर यूडीपी काम नहीं करता है, तो ICE, टीसीपी का इस्तेमाल करता है. अगर डायरेक्ट कनेक्शन काम नहीं करता, तो खास तौर पर एंटरप्राइज़ NAT ट्रैवर्सल और फ़ायरवॉल की वजह से - ICE, इंटरमीडियरी (रिले) टर्न सर्वर का इस्तेमाल करता है. इसका मतलब है कि ICE सबसे पहले अपने साथियों से सीधे कनेक्ट करने के लिए, STUN का इस्तेमाल UDP के साथ करता है. अगर ऐसा नहीं हो पाता है, तो ICE, टर्न रिले सर्वर पर वापस चला जाता है. उम्मीदवार ढूंढने वाले एक्सप्रेशन का मतलब नेटवर्क इंटरफ़ेस और पोर्ट को ढूंढने की प्रोसेस से है.
WebRTC के इंजीनियर जस्टिन Uberti ने 2013 Google I/O WebRTC प्रज़ेंटेशन में ICE, STUN, और TURN के बारे में ज़्यादा जानकारी दी है. (प्रज़ेंटेशन स्लाइड में टर्न और एसटीयूएन सर्वर के इस्तेमाल के उदाहरण दिए गए हैं.)
एक सामान्य वीडियो-चैट क्लाइंट
appr.tc पर वीडियो-चैट डेमो के ज़रिए, WebRTC को आज़माया जा सकता है. इसमें सिग्नलिंग और एनएटी/फ़ायरवॉल ट्रैवर्सल के साथ STUN सर्वर की मदद ली जा सकती है. यह ऐप्लिकेशन adapter.js का इस्तेमाल करता है, जो खास विशेषताओं और प्रीफ़िक्स अंतरों से ऐप्लिकेशन को अलग करने के लिए एक शिम है.
यह कोड अपनी लॉगिंग में जान-बूझकर ज़्यादा शब्दों में जानकारी देता है. इवेंट का क्रम समझने के लिए कंसोल देखें. नीचे, कोड के बारे में सिलसिलेवार तरीके से बताया गया है.
नेटवर्क टोपोलॉजी
अभी लागू किया गया WebRTC सिर्फ़ वन-टू-वन कम्यूनिकेशन के लिए काम करता है, लेकिन ज़्यादा जटिल नेटवर्क स्थितियों में इसका इस्तेमाल किया जा सकता है. उदाहरण के लिए, कई पीयर एक-दूसरे से सीधे या मल्टीपॉइंट कंट्रोल यूनिट (MCU) के ज़रिए बातचीत कर सकते हैं. यह एक ऐसा सर्वर है जो बड़ी संख्या में लोगों को स्ट्रीम कर सकता है और स्ट्रीम को आगे भेज सकता है. साथ ही, ऑडियो और वीडियो को मिक्स या रिकॉर्डिंग भी कर सकता है.
कई मौजूदा WebRTC ऐप्लिकेशन सिर्फ़ वेब ब्राउज़र के बीच कम्यूनिकेशन दिखाते हैं, लेकिन गेटवे सर्वर किसी ब्राउज़र पर चल रहे WebRTC ऐप्लिकेशन को चालू कर सकते हैं, ताकि वह टेलीफ़ोन (जिसे PSTN भी कहा जाता है) और VOIP सिस्टम जैसे डिवाइसों से इंटरैक्ट कर सके. मई 2012 में, Doubango Telecom ने WebRTC और WebSocket के साथ बनाए गए sipml5 SIP क्लाइंट को ओपन सोर्स किया, जो (अन्य संभावित इस्तेमाल के साथ) iOS और Android पर चल रहे ब्राउज़र और ऐप्लिकेशन के बीच वीडियो कॉल की सुविधा देता है. Google I/O में, Tethr और Tropo ने OpenBTS सेल का इस्तेमाल करके ब्रीफ़केस में आपदा से जुड़ी जानकारी के लिए एक फ़्रेमवर्क दिखाया, ताकि WebRTC के ज़रिए फ़ीचर फ़ोन और कंप्यूटर के बीच कम्यूनिकेशन चालू किया जा सके. किसी कैरियर के बिना टेलीफ़ोन संचार!
RTCDataChannel
एपीआई<
ऑडियो और वीडियो की तरह ही, WebRTC अन्य तरह के डेटा के लिए रीयल-टाइम कम्यूनिकेशन की सुविधा देता है.
RTCDataChannel
एपीआई की मदद से, पीयर-टू-पीयर डेटा ट्रांसफ़र करने की सुविधा मिलती है. इस डेटा में, इंतज़ार का समय कम होता है और डेटा ट्रांसफ़र की क्षमता ज़्यादा होती है. एक पेज के डेमो और आसानी से फ़ाइल ट्रांसफ़र करने वाला ऐप्लिकेशन बनाने का तरीका जानने के लिए, WebRTC सैंपल और WebRTC कोडलैब देखें.
इस एपीआई का इस्तेमाल कई तरीकों से किया जा सकता है. जैसे:
- गेमिंग
- रिमोट डेस्कटॉप ऐप्लिकेशन
- रीयल-टाइम में मैसेज करने की सुविधा
- फ़ाइल ट्रांसफ़र करें
- डीसेंट्रलाइज़्ड नेटवर्क
एपीआई में ऐसी कई सुविधाएं हैं जिनकी मदद से, RTCPeerConnection
का ज़्यादा से ज़्यादा फ़ायदा लिया जा सकता है. साथ ही, पीयर-टू-पीयर कम्यूनिकेशन को आसान और बेहतर बनाया जा सकता है:
RTCPeerConnection
सेशन के सेटअप का फ़ायदा- प्राथमिकता के साथ एक साथ कई चैनल
- भरोसेमंद और गलत डिलीवरी सिमेंटिक्स
- पहले से मौजूद सुरक्षा (डीटीएलएस) और कंजेशन कंट्रोल
- ऑडियो या वीडियो के साथ या उसके बिना इस्तेमाल करने की सुविधा
सिंटैक्स, send()
तरीके और message
इवेंट के साथ, WebSocket की तरह ही है:
const localConnection = new RTCPeerConnection(servers);
const remoteConnection = new RTCPeerConnection(servers);
const sendChannel =
localConnection.createDataChannel('sendDataChannel');
// ...
remoteConnection.ondatachannel = (event) => {
receiveChannel = event.channel;
receiveChannel.onmessage = onReceiveMessage;
receiveChannel.onopen = onReceiveChannelStateChange;
receiveChannel.onclose = onReceiveChannelStateChange;
};
function onReceiveMessage(event) {
document.querySelector("textarea#send").value = event.data;
}
document.querySelector("button#send").onclick = () => {
var data = document.querySelector("textarea#send").value;
sendChannel.send(data);
};
कम्यूनिकेशन सीधे ब्राउज़र के बीच होता है. इसलिए, फ़ायरवॉल और एनएटी का सामना करने के लिए होल-पंचिंग न होने पर भी RTCDataChannel
, WebSocket के मुकाबले तेज़ हो सकता है.
RTCDataChannel
Chrome, Safari, Firefox, Opera, और Samsung Internet में उपलब्ध है. Cube Slam गेम, गेम की स्थिति बताने के लिए एपीआई का इस्तेमाल करता है. किसी दोस्त के साथ खेलें या भालू के साथ खेलें! इनोवेटिव प्लैटफ़ॉर्म Sharefest ने RTCDataChannel
और peerCDN के ज़रिए फ़ाइल शेयर करने की सुविधा को चालू किया. इससे पता चला कि WebRTC किस तरह पीयर-टू-पीयर कॉन्टेंट डिस्ट्रिब्यूशन को चालू कर सकता है.
RTCDataChannel
के बारे में ज़्यादा जानकारी के लिए, आईईटीएफ़ के ड्राफ़्ट प्रोटोकॉल से जुड़ी खास बातें देखें.
सुरक्षा
रीयल-टाइम में बातचीत करने वाले किसी ऐप्लिकेशन या प्लगिन की वजह से, सुरक्षा को कई तरह से खतरा हो सकता है. उदाहरण के लिए:
- ऐसा हो सकता है कि एन्क्रिप्ट न किया गया मीडिया या डेटा, अलग-अलग ब्राउज़र या ब्राउज़र और सर्वर के बीच आ रहा हो.
- ऐप्लिकेशन, उपयोगकर्ता की जानकारी के बिना वीडियो या ऑडियो को रिकॉर्ड और शेयर कर सकता है.
- मैलवेयर या वायरस, किसी ऐसे प्लगिन या ऐप्लिकेशन के साथ इंस्टॉल किए जा सकते हैं जिसमें साफ़ तौर पर कोई नुकसान नहीं होता.
इन समस्याओं से बचने के लिए, WebRTC में कई सुविधाएं मौजूद हैं:
- WebRTC लागू करने की प्रोसेस में, DTLS और SRTP जैसे सुरक्षित प्रोटोकॉल इस्तेमाल किए जाते हैं.
- सिग्नलिंग सिस्टम के साथ-साथ WebRTC के सभी कॉम्पोनेंट के लिए, एन्क्रिप्ट (सुरक्षित) करना ज़रूरी है.
- WebRTC एक प्लग इन नहीं है. इसके कॉम्पोनेंट, ब्राउज़र के सैंडबॉक्स में चलते हैं, न कि किसी अलग प्रोसेस में. कॉम्पोनेंट को अलग से इंस्टॉल करने की ज़रूरत नहीं होती है और ब्राउज़र के अपडेट होने पर ये अपडेट हो जाते हैं.
- कैमरे और माइक्रोफ़ोन का ऐक्सेस साफ़ तौर पर दिया जाना चाहिए. साथ ही, जब कैमरा या माइक्रोफ़ोन चालू हो, तब यूज़र इंटरफ़ेस से इस बारे में साफ़ तौर पर पता चलता है.
इस लेख में, स्ट्रीमिंग मीडिया की सुरक्षा के बारे में पूरी जानकारी नहीं दी गई है. ज़्यादा जानकारी के लिए, आईईटीएफ़ की तरफ़ से सुझाया गया प्रपोज़ किया गया WebRTC सिक्योरिटी आर्किटेक्चर देखें.
कुल मिलाकर कहें, तो
WebRTC के API और मानक, सामग्री निर्माण और संचार के लिए टूल को लोकतांत्रिक और विकेंद्रीय बना सकते हैं. इसमें टेलीफ़ोनी, गेमिंग, वीडियो प्रोडक्शन, संगीत बनाने और समाचार सभा करने जैसे टूल शामिल हैं.
टेक्नोलॉजी का इससे ज़्यादा नुकसान नहीं पहुंचता है.
जैसा कि ब्लॉगर फ़िल एडहोम ने कहा, "संभावित रूप से, WebRTC और HTML5 में रीयल-टाइम संचार के लिए वही रूपांतरण सक्षम हो सकता है जो मूल ब्राउज़र ने जानकारी के लिए किया था."
डेवलपर टूल
- चल रहे सेशन के लिए, WebRTC के आंकड़े यहां देखे जा सकते हैं:
- Chrome में about://webrtc-internals
- Opera://webrtc-internals ऑपरा
- Firefox में about:webrtc
- क्रॉस ब्राउज़र इंटरऑप नोट
- adapter.js, WebRTC के लिए एक JavaScript शिम है. इसे Google, WebRTC समुदाय की मदद से मैनेज करता है. यह वेंडर प्रीफ़िक्स, ब्राउज़र के अंतर, और खास जानकारी में हुए बदलावों को ऐब्स्ट्रैक्ट करता है.
- WebRTC सिग्नलिंग की प्रोसेस के बारे में ज़्यादा जानने के लिए, कंसोल में appr.tc का लॉग आउटपुट देखें.
- अगर यह बहुत ज़्यादा है, तो किसी WebRTC फ़्रेमवर्क या पूरी WebRTC सेवा का इस्तेमाल करें.
- गड़बड़ी की रिपोर्ट और सुविधा के अनुरोधों को हमेशा स्वीकार किया जाता है:
ज़्यादा जानें
- Google I/O 2012 में जस्टिन उबेरती का WebRTC सत्र
- ऐलन बी॰ जॉन्सटन और डेनियल सी॰ बर्नेट ने एक WebRTC किताब को, webrtcbook.com पर प्रिंट और ई-बुक फ़ॉर्मैट में अपने तीसरे वर्शन में मैनेज किया.
- webrtc.org पर WebRTC से जुड़ी सभी चीज़ें देखी जा सकती हैं. इनमें डेमो, दस्तावेज़, और चर्चा शामिल हैं.
- चर्चा-webrtc, WebRTC से जुड़ी तकनीकी चर्चा के लिए बना एक Google ग्रुप है.
- @webrtc
- Google Developers टॉक दस्तावेज़, NAT ट्रैवर्सल, STUN, रिले सर्वर, और कैंडिडेट इकट्ठा करने के बारे में ज़्यादा जानकारी देता है.
- GitHub पर WebRTC
- WebRTC के बारे में सवाल पूछने और जवाब खोजने के लिए, Stack Overflow एक बेहतरीन प्लैटफ़ॉर्म है.
मानक और प्रोटोकॉल
- WebRTC W3C एडिटर का ड्राफ़्ट
- W3C एडिटर का ड्राफ़्ट: मीडिया कैप्चर और स्ट्रीम (इसे
getUserMedia
भी कहा जाता है) - आईईटीएफ़ वर्किंग ग्रुप चार्टर
- आईईटीएफ़ WebRTC डेटा चैनल प्रोटोकॉल का ड्राफ़्ट
- आईईटीएफ़ जेएसईपी का ड्राफ़्ट
- ICE के लिए सुझाए गए आईईटीएफ़ स्टैंडर्ड
- IETF RTCWEB वर्किंग ग्रुप इंटरनेट-ड्राफ़्ट: वेब रीयल-टाइम कम्यूनिकेशन के इस्तेमाल के उदाहरण और ज़रूरी शर्तें
WebRTC सहायता की खास जानकारी
MediaStream
और getUserMedia
एपीआई
- Chrome डेस्कटॉप 18.0.1008 और इसके बाद वाले वर्शन; Android 29 और इसके बाद के वर्शन के लिए Chrome
- Opera 18 और उसके बाद के वर्शन; Android 20 और इसके बाद वाले वर्शन के लिए Opera
- Opera 12, Opera Mobile 12 (Presto इंजन पर आधारित)
- Firefox 17 और उसके बाद के वर्शन
- Microsoft Edge 16 और इसके बाद के वर्शन
- iOS पर Safari 11.2 और उसके बाद के वर्शन और MacOS पर 11.1 और उसके बाद के वर्शन
- Android पर UC 11.8 और उसके बाद के वर्शन
- Samsung Internet 4 और उससे उच्च वर्शन
RTCPeerConnection
एपीआई
- Chrome डेस्कटॉप 20 और उसके बाद के वर्शन; Android 29 और उसके बाद वाले वर्शन के लिए Chrome (फ़्लैगलेस)
- Opera 18 और उसके बाद के वर्शन (डिफ़ॉल्ट रूप से चालू); Android 20 और उसके बाद वाले वर्शन के लिए Opera (डिफ़ॉल्ट रूप से चालू)
- Firefox 22 और उसके बाद के वर्शन (डिफ़ॉल्ट रूप से चालू)
- Microsoft Edge 16 और इसके बाद के वर्शन
- iOS पर Safari 11.2 और उसके बाद के वर्शन और MacOS पर 11.1 और उसके बाद के वर्शन
- Samsung Internet 4 और उससे उच्च वर्शन
RTCDataChannel
एपीआई
- Chrome 25 में प्रयोग के तौर पर उपलब्ध वर्शन, लेकिन Chrome 26 और इसके बाद के वर्शन में ज़्यादा स्थिर (और Firefox इंटरऑपरेबिलिटी के साथ) Android 29 और उसके बाद के वर्शन के लिए Chrome
- Opera 18 और उसके बाद के वर्शन में स्थिर वर्शन (और Firefox इंटरऑपरेबिलिटी के साथ) Android 20 और इसके बाद वाले वर्शन के लिए Opera
- Firefox 22 और उसके बाद के वर्शन (डिफ़ॉल्ट रूप से चालू)
getUserMedia
और RTCPeerConnection
जैसे एपीआई के लिए क्रॉस-प्लैटफ़ॉर्म की सुविधा के बारे में ज़्यादा जानकारी पाने के लिए, caniuse.com और Chrome प्लैटफ़ॉर्म की स्थिति देखें.
RTCPeerConnection
के लिए नेटिव एपीआई, webrtc.org पर मौजूद दस्तावेज़ पर उपलब्ध हैं.