WebRTC เป็นแนวหน้าใหม่ในสงครามที่ยาวนานสำหรับเว็บที่เปิดกว้างและไร้ปัญหา
Brendan Eich ผู้คิดค้น JavaScript
การสื่อสารแบบเรียลไทม์โดยไม่ต้องใช้ปลั๊กอิน
ลองจินตนาการถึงโลกที่โทรศัพท์ ทีวี และคอมพิวเตอร์ของคุณสามารถสื่อสารกันบนแพลตฟอร์มทั่วไป ลองจินตนาการว่าการเพิ่มวิดีโอแชทและการแชร์ข้อมูลระหว่างเครื่องไปยังเว็บแอปนั้นทำได้ง่าย นี่คือวิสัยทัศน์ของ WebRTC
อยากลองใช้ดูไหม WebRTC ให้บริการบนเดสก์ท็อปและอุปกรณ์เคลื่อนที่ใน Google Chrome, Safari, Firefox และ Opera ที่ที่ควรเริ่มต้นก็คือแอปวิดีโอแชทง่ายๆ ที่ appr.tc ดังนี้
- เปิด appr.tc ในเบราว์เซอร์
- คลิกเข้าร่วมเพื่อเข้าร่วมห้องแชทและอนุญาตให้แอปใช้เว็บแคม
- เปิด URL ที่แสดงตรงท้ายหน้าในแท็บใหม่ หรือในคอมพิวเตอร์เครื่องอื่น
การเริ่มใช้งานอย่างง่าย
หากไม่มีเวลาอ่านบทความนี้หรือต้องการเพียงโค้ด
- หากต้องการดูภาพรวมของ WebRTC ดูวิดีโอ Google I/O ต่อไปนี้หรือดูสไลด์เหล่านี้
- หากยังไม่ได้ใช้
getUserMedia
API โปรดดูบันทึกเสียงและวิดีโอใน HTML5 และ simpl.info getUserMedia - ดูข้อมูลเกี่ยวกับ
RTCPeerConnection
API ในตัวอย่างต่อไปนี้และ 'simpl.info RTCPeerConnection' - หากต้องการดูวิธีที่ WebRTC ใช้เซิร์ฟเวอร์ในการส่งสัญญาณ รวมถึงไฟร์วอลล์และ NAT Traversal โปรดดูโค้ดและบันทึกของคอนโซลจาก appr.tc
- หากรอไม่ไหวและต้องการลองใช้ WebRTC ตอนนี้เลย ลองการสาธิตมากกว่า 20 รายการที่ใช้ WebRTC JavaScript API
- หากมีปัญหากับเครื่องและ WebRTC ไปที่เครื่องมือแก้ปัญหา WebRTC
หรือไปที่ WebRTC Codelab ซึ่งเป็นคำแนะนำทีละขั้นตอนที่อธิบายวิธีสร้างแอปวิดีโอแชทที่สมบูรณ์ รวมทั้งเซิร์ฟเวอร์ส่งสัญญาณแบบง่าย
ประวัติการใช้งาน WebRTC ที่สั้นมาก
หนึ่งในความท้าทายหลักๆ ประการสุดท้ายสำหรับเว็บคือการเปิดใช้การสื่อสารของมนุษย์ผ่านเสียงและวิดีโอ ซึ่งก็คือการสื่อสารแบบเรียลไทม์ หรือที่เรียกสั้นๆ ว่า RTC RTC ควรทำงานตามธรรมชาติในเว็บแอปเช่นเดียวกับการป้อนข้อความในการป้อนข้อความ หากไม่เป็นเช่นนั้น คุณจะถูกจำกัดความสามารถในการสร้างนวัตกรรมและพัฒนาวิธีการใหม่ๆ ในการโต้ตอบกับผู้คน
ที่ผ่านมา RTC เป็นระบบที่มีความซับซ้อนและซับซ้อน จึงต้องใช้เทคโนโลยีเสียงและวิดีโอราคาแพงในการขอใบอนุญาตใช้งานหรือพัฒนาภายในบริษัท การผสานรวมเทคโนโลยี RTC เข้ากับเนื้อหา ข้อมูล และบริการที่มีอยู่นั้นเป็นเรื่องยากและใช้เวลานานโดยเฉพาะอย่างยิ่งบนเว็บ
วิดีโอแชทใน Gmail เริ่มได้รับความนิยมในปี 2008 และในปี 2011 Google ได้เปิดตัว Hangouts ซึ่งใช้ Talk (เช่นเดียวกับ Gmail) Google ซื้อ GIPS ซึ่งเป็นบริษัทที่พัฒนาองค์ประกอบหลายอย่างที่จำเป็นสำหรับ RTC เช่น ตัวแปลงรหัสและเทคนิคการตัดเสียงก้อง Google เผยแพร่เทคโนโลยีที่พัฒนาโดย GIPS และทำงานร่วมกับหน่วยงานด้านมาตรฐานที่เกี่ยวข้องของคณะทำงานเฉพาะกิจด้านวิศวกรรมอินเทอร์เน็ต (IETF) และ World Wide Web Consortium (W3C) เพื่อสร้างความเห็นพ้องของอุตสาหกรรม ในเดือนพฤษภาคม 2011 Ericsson ได้สร้างการใช้งาน WebRTC ครั้งแรก
WebRTC ใช้มาตรฐานแบบเปิดสำหรับการสื่อสารเกี่ยวกับวิดีโอ เสียง และข้อมูลแบบเรียลไทม์ที่ไม่มีปลั๊กอิน ความต้องการนั้นมีอยู่จริง
- บริการเว็บจำนวนมากใช้ RTC แต่จำเป็นต้องดาวน์โหลด แอปที่มาพร้อมเครื่อง หรือปลั๊กอิน ซึ่งรวมถึง Skype, Facebook และ Hangouts
- การดาวน์โหลด ติดตั้ง และอัปเดตปลั๊กอินมีความซับซ้อน มักเกิดข้อผิดพลาด และน่ารำคาญ
- ปลั๊กอินนั้นใช้งาน แก้ไขข้อบกพร่อง แก้ปัญหา ทดสอบ และดูแลรักษาได้ยาก ทั้งยังอาจต้องมีการอนุญาตให้ใช้สิทธิและการผสานรวมกับเทคโนโลยีที่ซับซ้อนและมีราคาแพง แต่การโน้มน้าวให้ผู้ใช้ติดตั้งปลั๊กอินตั้งแต่แรกมักเป็นเรื่องยาก
หลักการสำคัญของโปรเจ็กต์ WebRTC คือ API ควรเป็นแบบโอเพนซอร์ส ฟรี มีมาตรฐาน มีอยู่ในเว็บเบราว์เซอร์ และมีประสิทธิภาพมากกว่าเทคโนโลยีที่มีอยู่
ตอนนี้เราอยู่ที่ไหน
WebRTC ใช้ในแอปต่างๆ เช่น Google Meet WebRTC ยังได้ผนวกรวมกับ WebKitGTK+ และ แอป Qt ที่มาพร้อมเครื่อง
WebRTC ใช้ API ทั้ง 3 รายการนี้
- MediaStream
(หรือที่เรียกว่า getUserMedia
)
- RTCPeerConnection
- RTCDataChannel
API มีข้อกำหนด 2 ข้อดังต่อไปนี้
API ทั้ง 3 ประเภทได้รับการรองรับในอุปกรณ์เคลื่อนที่และเดสก์ท็อปโดย Chrome, Safari, Firefox, Edge และ Opera
getUserMedia
: สำหรับเดโมและโค้ด โปรดดูตัวอย่าง WebRTC หรือลองใช้ตัวอย่างน่าทึ่งของ Chris Wilson ที่ใช้ getUserMedia
เป็นอินพุตสำหรับเสียงบนเว็บ
RTCPeerConnection
: โปรดดูการสาธิตอย่างง่ายและแอปวิดีโอแชทที่มีฟังก์ชันการทำงานเต็มรูปแบบ โปรดดูตัวอย่างการเชื่อมต่อเพียร์ของ WebRTC และ appr.tc ตามลำดับ แอปนี้ใช้ adapter.js ซึ่งเป็นโค้ด JavaScript ที่ดูแลโดย Google ด้วยความช่วยเหลือจากชุมชน WebRTC เพื่อแยกความแตกต่างของเบราว์เซอร์และการเปลี่ยนแปลงข้อกำหนดออกไป
RTCDataChannel
: หากต้องการดูตัวอย่างการใช้งานจริง โปรดดูตัวอย่าง WebRTC เพื่อดูการสาธิตเกี่ยวกับช่องทางข้อมูลรายการใดรายการหนึ่ง
WebRTC Codelab จะแสดงวิธีใช้ API ทั้ง 3 นี้เพื่อสร้างแอปง่ายๆ สำหรับวิดีโอแชทและการแชร์ไฟล์
WebRTC แรกของคุณ
แอป WebRTC ต้องทําหลายอย่าง ดังนี้
- รับการสตรีมเสียง วิดีโอ หรือข้อมูลอื่นๆ
- รับข้อมูลเครือข่าย เช่น ที่อยู่ IP และพอร์ต แล้วแลกเปลี่ยนกับไคลเอ็นต์ WebRTC อื่นๆ (หรือที่เรียกว่าเพียร์) เพื่อเปิดใช้การเชื่อมต่อ รวมถึงผ่าน NAT และไฟร์วอลล์
- ประสานงานด้านการส่งสัญญาณเพื่อรายงานข้อผิดพลาดและเริ่มหรือปิดเซสชัน
- แลกเปลี่ยนข้อมูลเกี่ยวกับสื่อและความสามารถของไคลเอ็นต์ เช่น ความละเอียดและตัวแปลงรหัส
- สื่อสารสตรีมมิงเสียง วิดีโอ หรือข้อมูล
WebRTC จะใช้ API ต่อไปนี้ในการรับและสื่อสารข้อมูลสตรีมมิง
MediaStream
จะได้รับสิทธิ์เข้าถึงสตรีมข้อมูล เช่น จากกล้องและไมโครโฟนของผู้ใช้RTCPeerConnection
จะเปิดใช้การโทรด้วยเสียงหรือวิดีโอคอลพร้อมด้วยสิ่งอำนวยความสะดวกในการจัดการการเข้ารหัสและการจัดการแบนด์วิดท์RTCDataChannel
ช่วยให้สามารถสื่อสารข้อมูลทั่วไปแบบเพียร์ทูเพียร์ได้
(มีการพูดคุยอย่างละเอียดเกี่ยวกับเครือข่ายและการส่งสัญญาณของ WebRTC ในภายหลัง)
MediaStream
API (หรือที่เรียกว่า getUserMedia
API)
MediaStream
API แสดงสตรีมสื่อที่ซิงค์ ตัวอย่างเช่น สตรีมที่ได้จากกล้องและไมโครโฟนจะซิงค์ข้อมูลแทร็กวิดีโอและแทร็กเสียง (อย่าสับสนระหว่าง MediaStreamTrack
กับองค์ประกอบ <track>
ซึ่งเป็นสิ่งที่แตกต่างอย่างสิ้นเชิง)
บางทีวิธีที่ง่ายที่สุดในการทำความเข้าใจ API ของ MediaStream
คือการดูจริงๆ เท่านั้น
- ในเบราว์เซอร์ ให้ไปที่ตัวอย่าง WebRTC
getUserMedia
- เปิดคอนโซล
- ตรวจสอบตัวแปร
stream
ซึ่งอยู่ในขอบเขตทั้งหมด
MediaStream
แต่ละรายการมีอินพุต ซึ่งอาจเป็น MediaStream
ที่ getUserMedia()
สร้างขึ้น และมีเอาต์พุต ซึ่งอาจส่งไปยังองค์ประกอบวิดีโอหรือ RTCPeerConnection
เมธอด getUserMedia()
จะรับพารามิเตอร์ออบเจ็กต์ MediaStreamConstraints
และแสดงผล Promise
ที่แปลงเป็นออบเจ็กต์ MediaStream
MediaStream
แต่ละรายการจะมี label
เช่น 'Xk7EuLhsuHKbnjLWkW4yYGNJJ8ONsgwHBvLQ'
เมธอด getAudioTracks()
และ getVideoTracks()
จะแสดงผลอาร์เรย์ของ MediaStreamTrack
สำหรับตัวอย่าง getUserMedia
stream.getAudioTracks()
จะแสดงผลอาร์เรย์ว่าง (เนื่องจากไม่มีเสียง) และสมมติว่าเว็บแคมที่ใช้งานได้เชื่อมต่ออยู่ stream.getVideoTracks()
จะแสดงผลอาร์เรย์ของ MediaStreamTrack
1 รายการที่แสดงถึงสตรีมจากเว็บแคม MediaStreamTrack
แต่ละรายการจะมีชนิด ('video'
หรือ 'audio'
), label
(ประมาณ 'FaceTime HD Camera (Built-in)'
) และแสดงถึงช่องของเสียงหรือวิดีโออย่างน้อย 1 ช่อง ในกรณีนี้จะมีแทร็กวิดีโอเพียงแทร็กเดียวและไม่มีเสียง แต่คุณสามารถนึกภาพการใช้งานในกรณีการใช้งานอื่นๆ ได้ไม่ยาก เช่น แอปแชทที่สตรีมจากกล้องหน้า กล้องหลัง ไมโครโฟน และแอปแชร์หน้าจอ
คุณสามารถแนบ MediaStream
เข้ากับองค์ประกอบวิดีโอได้โดยการตั้งค่าแอตทริบิวต์ srcObject
ก่อนหน้านี้วิธีดังกล่าวทำได้ด้วยการตั้งค่าแอตทริบิวต์ src
เป็น URL ของออบเจ็กต์ที่สร้างด้วย URL.createObjectURL()
แต่เลิกใช้งานไปแล้ว
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
ในไฟล์ Manifest จะทำให้มีการขอและให้สิทธิ์ได้เพียงครั้งเดียวเมื่อติดตั้ง หลังจากนั้นระบบจะไม่ขอสิทธิ์เข้าถึงกล้องหรือไมโครโฟนจากผู้ใช้
คุณให้สิทธิ์ getUserMedia()
เพียงครั้งเดียว ในครั้งแรกที่ใช้งานปุ่ม "อนุญาต" จะปรากฏขึ้นในแถบข้อมูลของเบราว์เซอร์ Chrome ได้เลิกใช้การเข้าถึง HTTP สำหรับ getUserMedia()
เมื่อตอนสิ้นปี 2015 เนื่องจากได้รับการจัดประเภทเป็นฟีเจอร์ที่มีประสิทธิภาพ
มีความเป็นไปได้ที่จะมีการใช้ MediaStream
กับแหล่งข้อมูลสตรีมมิงทั้งหมด ไม่ใช่แค่กล้องหรือไมโครโฟน การดำเนินการนี้จะทำให้สามารถสตรีมจากข้อมูลที่จัดเก็บไว้หรือแหล่งข้อมูลที่กำหนดเอง เช่น เซ็นเซอร์หรืออินพุตอื่นๆ
getUserMedia()
ทำงานจริงเมื่อผสานรวมกับ JavaScript API และไลบรารีอื่นๆ:
- Webcam Toy คือแอปโฟโต้บูธที่ใช้ WebGL เพื่อเพิ่มเอฟเฟกต์แปลกๆ ที่ยอดเยี่ยมให้กับรูปภาพที่แชร์หรือบันทึกในเครื่องได้
- FaceKat เป็นเกมการติดตามใบหน้าที่สร้างขึ้นด้วย headtrackr.js
- กล้อง ASCII ใช้ Canvas API เพื่อสร้างรูปภาพ ASCII
ข้อจำกัด
คุณสามารถใช้ข้อจำกัดเพื่อตั้งค่าความละเอียดของวิดีโอสำหรับ getUserMedia()
ได้ ทั้งยังช่วยให้สามารถรองรับข้อจำกัดอื่นๆ เช่น สัดส่วนภาพ โหมดหันข้าง (กล้องหน้าหรือกล้องหลัง) อัตราเฟรม ความสูงและความกว้าง และวิธี applyConstraints()
ดูตัวอย่างได้ที่ตัวอย่าง WebRTC getUserMedia
: เลือกความละเอียด
การตั้งค่าข้อจำกัดที่ไม่ได้รับอนุญาตจะทำให้ได้ DOMException
หรือ OverconstrainedError
ตัวอย่างเช่น หากความละเอียดที่ขอไม่พร้อมใช้งาน หากต้องการดูการใช้งานจริง โปรดดูตัวอย่าง WebRTC getUserMedia
: เลือกความละเอียดสำหรับการสาธิต
การจับภาพหน้าจอและแท็บ
แอป Chrome ยังช่วยให้คุณแชร์วิดีโอสดของแท็บเบราว์เซอร์เดียวหรือทั้งเดสก์ท็อปผ่าน API ของ chrome.tabCapture
และ chrome.desktopCapture
ได้ด้วย (สำหรับการสาธิตและข้อมูลเพิ่มเติม โปรดดูการแชร์หน้าจอด้วย WebRTC บทความนี้มีอายุ 2-3 ปี แต่ก็ยังน่าสนใจอยู่)
นอกจากนี้ คุณยังใช้การจับภาพหน้าจอเป็นแหล่งที่มา MediaStream
ใน Chrome ได้โดยใช้ข้อจำกัด chromeMediaSource
แบบทดลอง โปรดทราบว่าการจับภาพหน้าจอต้องใช้ HTTPS และควรใช้สำหรับการพัฒนาเท่านั้นเนื่องจากมีการเปิดใช้ผ่านแฟล็กบรรทัดคำสั่งตามที่อธิบายไว้ในโพสต์นี้
การส่งสัญญาณ: การควบคุมเซสชัน เครือข่าย และข้อมูลสื่อ
WebRTC ใช้ RTCPeerConnection
เพื่อสื่อสารสตรีมมิงระหว่างเบราว์เซอร์ (หรือที่เรียกว่าแอปเทียบเท่า) แต่ก็ต้องการกลไกในการประสานงานการสื่อสารและส่งข้อความควบคุม ซึ่งเป็นกระบวนการที่เรียกว่าการส่งสัญญาณ WebRTC จะไม่ระบุวิธีการส่งสัญญาณและโปรโตคอล การส่งสัญญาณไม่ได้เป็นส่วนหนึ่งของ RTCPeerConnection
API
แต่นักพัฒนาแอป WebRTC สามารถเลือกโปรโตคอลการรับส่งข้อความใดก็ได้ที่ต้องการ เช่น SIP หรือ XMPP และช่องทางการสื่อสารแบบ 2 ทาง (2 ทาง) ที่เหมาะสม ตัวอย่าง appr.tc ใช้ XHR และ Channel API เป็นกลไกการส่งสัญญาณ codelab ใช้ Socket.io ที่ทำงานบนเซิร์ฟเวอร์โหนด
การส่งสัญญาณใช้เพื่อแลกเปลี่ยนข้อมูล 3 ประเภทดังนี้
- ข้อความควบคุมเซสชัน: เพื่อเริ่มต้นหรือปิดการสื่อสารและรายงานข้อผิดพลาด
- การกำหนดค่าเครือข่าย: สำหรับบุคคลภายนอก ที่อยู่ IP และพอร์ตของคอมพิวเตอร์คืออะไร
- ความสามารถของสื่อ: ตัวแปลงรหัสและความละเอียดใดที่เบราว์เซอร์ของคุณและจัดการด้วยได้
การแลกเปลี่ยนข้อมูลผ่านการส่งสัญญาณต้องเสร็จสมบูรณ์ก่อนจึงจะเริ่มการสตรีมแบบเพียร์ทูเพียร์ได้
ตัวอย่างเช่น สมมติว่าอรวรรณต้องการสื่อสารกับบ๊อบ ต่อไปนี้เป็นตัวอย่างโค้ดจากข้อกำหนด WebRTC ของ W3C ซึ่งแสดงกระบวนการส่งสัญญาณในสถานการณ์จริง โค้ดนี้จะถือว่ามีกลไกการส่งสัญญาณบางอย่างที่สร้างขึ้นในเมธอด 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);
}
};
อันดับแรก Alice และ Bob แลกเปลี่ยนข้อมูลเครือข่าย (นิพจน์การค้นหาตัวเลือกหมายถึงกระบวนการค้นหาอินเทอร์เฟซและพอร์ตเครือข่ายโดยใช้เฟรมเวิร์กของ ICE)
- อรวรรณสร้างออบเจ็กต์
RTCPeerConnection
ด้วยเครื่องจัดการonicecandidate
ซึ่งจะทำงานเมื่อตัวเลือกเครือข่ายพร้อมใช้งาน - อลิซส่งข้อมูลผู้สมัครแบบต่อเนื่องให้กับบัญชาผ่านช่องทางส่งสัญญาณใดก็ตามที่เขาใช้อยู่ เช่น WebSocket หรือกลไกอื่นๆ
- เมื่อบัญชาได้รับข้อความของผู้สมัครจากอลิสา เขาจะโทรหา
addIceCandidate
เพื่อเพิ่มผู้สมัครนั้นในคำอธิบายของเพื่อนระยะไกล
ไคลเอ็นต์ WebRTC (หรือที่เรียกกันว่า Perers หรือในตัวอย่างนี้คือ Alice และ Bob) จำเป็นต้องสืบหาและแลกเปลี่ยนข้อมูลสื่อเสียงและวิดีโอทั้งในระบบและระยะไกล เช่น ความละเอียดและความสามารถของตัวแปลงรหัส การส่งสัญญาณเพื่อแลกเปลี่ยนข้อมูลการกำหนดค่าสื่อจะดำเนินการโดยการแลกเปลี่ยนข้อเสนอและคำตอบโดยใช้โปรโตคอลคำอธิบายเซสชัน (SDP)
- ขวัญใจเรียกใช้เมธอด
RTCPeerConnection
createOffer()
การส่งคืนจากรายการนี้ส่งผ่านRTCSessionDescription
- คำอธิบายเซสชันในเครื่องของอรวรรณ - ใน Callback Alice จะตั้งคำอธิบายในเครื่องโดยใช้
setLocalDescription()
จากนั้นส่งคำอธิบายเซสชันนี้ไปให้บัญชาผ่านช่องทางส่งสัญญาณ โปรดทราบว่าRTCPeerConnection
จะไม่เริ่มรวบรวมผู้สมัครจนกว่าจะมีการเรียกใช้setLocalDescription()
ซึ่งจะอยู่ในฉบับร่าง JSEP IETF - อานนท์เขียนคำอธิบายที่อลิสาส่งให้เขาเป็นคำอธิบายระยะไกลโดยใช้
setRemoteDescription()
- บัญชาเรียกใช้เมธอด
createAnswer()
ของRTCPeerConnection
โดยส่งต่อคำอธิบายระยะไกลที่ได้รับจาก Alice เพื่อสร้างเซสชันในเครื่องที่เข้ากันได้กับของเธอ การเรียกกลับcreateAnswer()
ผ่านRTCSessionDescription
บ๊อบกำหนดชื่อนั้นเป็นคำอธิบายในเครื่องและส่งให้ Alice - เมื่ออลิซฟังคำอธิบายเซสชันของบัญชา เธอกำหนดให้คำอธิบายดังกล่าวเป็นคำอธิบายระยะไกลด้วย
setRemoteDescription
- ปิง!
ออบเจ็กต์ RTCSessionDescription
เป็น BLOB ที่สอดคล้องกับโปรโตคอลคำอธิบายเซสชัน, SDP ทำให้เป็นอนุกรม ออบเจ็กต์ 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
การได้มาและแลกเปลี่ยนข้อมูลเครือข่ายและสื่อนั้นทำพร้อมกันได้ แต่ทั้ง 2 กระบวนการต้องเสร็จสิ้นก่อนที่การสตรีมเสียงและวิดีโอระหว่างแอปเทียบเท่าจะเริ่มต้นได้
สถาปัตยกรรมข้อเสนอ/คำตอบที่อธิบายไว้ก่อนหน้านี้เรียกว่าโปรโตคอลการสร้างเซสชัน JavaScript หรือ JSEP (มีภาพเคลื่อนไหวที่ยอดเยี่ยมซึ่งอธิบายขั้นตอนการส่งสัญญาณและการสตรีมในวิดีโอสาธิตของเอริคสันสำหรับการติดตั้งใช้งาน WebRTC ครั้งแรก)
เมื่อขั้นตอนการส่งสัญญาณเสร็จสมบูรณ์ ข้อมูลจะสตรีมโดยตรงแบบเพียร์ทูเพียร์ระหว่างผู้โทรและ Callee ได้ หรือหากล้มเหลวผ่านเซิร์ฟเวอร์การส่งต่อที่เป็นตัวกลาง (ดูรายละเอียดเพิ่มเติมในภายหลัง) สตรีมมิงเป็นหน้าที่ของ RTCPeerConnection
RTCPeerConnection
RTCPeerConnection
เป็นคอมโพเนนต์ WebRTC ที่จัดการการสื่อสารที่เสถียรและมีประสิทธิภาพของข้อมูลสตรีมมิงระหว่างแอปเทียบเท่า
แผนภาพสถาปัตยกรรม WebRTC ที่แสดงบทบาทของ RTCPeerConnection
มีดังนี้ คุณจะเห็นได้ว่าส่วนสีเขียวนั้นซับซ้อน
จากมุมมองของ JavaScript สิ่งสำคัญที่ต้องทำความเข้าใจจากแผนภาพนี้คือ RTCPeerConnection
ปกป้องนักพัฒนาเว็บจากความซับซ้อนมากมายที่แฝงตัวอยู่เบื้องล่าง ตัวแปลงรหัสและโปรโตคอลที่ WebRTC ใช้งานทำงานจำนวนมากเพื่อทำให้การสื่อสารแบบเรียลไทม์เป็นไปได้ แม้ว่าจะทำผ่านเครือข่ายที่ไม่น่าเชื่อถือ:
- การปกปิดการสูญเสียแพ็กเก็ต
- การตัดเสียงก้อง
- การปรับแบนด์วิดท์
- การบัฟเฟอร์ Jitter แบบไดนามิก
- การควบคุมค่าเกนอัตโนมัติ
- การลดและตัดเสียงรบกวน
- การทำความสะอาดรูปภาพ
รหัส W3C ก่อนหน้านี้แสดงตัวอย่างแบบง่ายของ WebRTC จากมุมมองการส่งสัญญาณ ต่อไปนี้คือคำแนะนำแบบทีละขั้นของแอป WebRTC ที่ใช้งานได้ 2 แอป ตัวอย่างแรกเป็นตัวอย่างง่ายๆ ที่จะสาธิตให้ RTCPeerConnection
เห็น และตัวอย่างที่ 2 เป็นไคลเอ็นต์วิดีโอแชทที่ทำงานได้อย่างสมบูรณ์
RTCPeerConnection ที่ไม่มีเซิร์ฟเวอร์
โค้ดต่อไปนี้ได้มาจากการเชื่อมต่อเพียร์ของตัวอย่าง WebRTC ซึ่งมีRTCPeerConnection
ภายในเครื่องและระยะไกล (และวิดีโอในเครื่องและระยะไกล) บนหน้าเว็บเดียว ซึ่งไม่ได้มีประโยชน์ใดๆ มากนัก เช่น ผู้โทรและ Callee อยู่ในหน้าเดียวกัน แต่ทำให้การทำงานของ RTCPeerConnection
API ชัดเจนขึ้นเล็กน้อยเนื่องจากออบเจ็กต์ RTCPeerConnection
ในหน้าเว็บสามารถแลกเปลี่ยนข้อมูลและข้อความได้โดยตรงโดยไม่ต้องใช้กลไกการส่งสัญญาณตัวกลาง
ในตัวอย่างนี้ pc1
แสดงถึงเครื่องในเครือข่ายเดียวกัน (ผู้โทร) และ pc2
แสดงถึงเครื่องระยะไกล (ผู้โทร)
ผู้โทร
- สร้าง
RTCPeerConnection
ใหม่และเพิ่มสตรีมจากgetUserMedia()
: ```js // เซิร์ฟเวอร์คือไฟล์การกำหนดค่าที่ไม่บังคับ (โปรดดูการสนทนา "TURN และ STUN) ในภายหลัง) 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
API บวกเซิร์ฟเวอร์
ในโลกแห่งความเป็นจริง WebRTC จำเป็นต้องใช้เซิร์ฟเวอร์ แต่มีความเรียบง่าย สิ่งที่เกิดขึ้นได้มีดังต่อไปนี้
- ผู้ใช้สามารถค้นพบกันและกันและแลกเปลี่ยนรายละเอียดในโลกแห่งความเป็นจริง เช่น ชื่อ
- ข้อมูลเครือข่ายการแลกเปลี่ยนแอป (แอปเทียบเท่า) ของไคลเอ็นต์ WebRTC
- แอปเทียบเท่าแลกเปลี่ยนข้อมูลเกี่ยวกับสื่อ เช่น รูปแบบวิดีโอและความละเอียด
- แอปไคลเอ็นต์ WebRTC ข้ามเกตเวย์ NAT และไฟร์วอลล์
กล่าวคือ WebRTC ต้องมีฟังก์ชันการทำงานฝั่งเซิร์ฟเวอร์ 4 ประเภทดังนี้
- การค้นพบและการสื่อสารของผู้ใช้
- การส่งสัญญาณ
- การส่งผ่าน NAT/ไฟร์วอลล์
- เซิร์ฟเวอร์รีเลย์ในกรณีที่การสื่อสารระหว่างเครื่องล้มเหลว
NAT Traversal, เครือข่ายระหว่างเครื่อง และข้อกำหนดในการสร้างแอปเซิร์ฟเวอร์เพื่อการค้นพบและส่งสัญญาณของผู้ใช้นั้นอยู่นอกเหนือขอบเขตของบทความนี้ ซึ่งเพียงพอที่จะกล่าวได้ว่าเฟรมเวิร์ก ICE ใช้โปรโตคอล STUN และนามสกุล TURN เพื่อให้ RTCPeerConnection
จัดการกับ NAT Traversal และเครือข่ายอื่นๆ ได้
ICE เป็นเฟรมเวิร์กสำหรับเชื่อมต่อเพื่อนร่วมงาน เช่น โปรแกรมวิดีโอแชท 2 โปรแกรม ในขั้นต้น ICE จะพยายามเชื่อมต่อแอปเทียบเท่าโดยตรงด้วยเวลาในการตอบสนองต่ำที่สุดผ่าน UDP ในกระบวนการนี้ เซิร์ฟเวอร์ STUN จะมีงานเดียว นั่นคือช่วยให้เพียร์ที่อยู่เบื้องหลัง NAT เพื่อค้นหาที่อยู่และพอร์ตสาธารณะได้ (ดูข้อมูลเพิ่มเติมเกี่ยวกับ STUN และ TURN ได้ที่สร้างบริการแบ็กเอนด์ที่จำเป็นสำหรับแอป WebRTC)
หาก UDP ล้มเหลว ICE จะดำเนินการกับ TCP หากการเชื่อมต่อโดยตรงล้มเหลว โดยเฉพาะเนื่องจากการรับส่งข้อมูล NAT และไฟร์วอลล์ขององค์กร ICE จะใช้เซิร์ฟเวอร์ TURN ที่เป็นตัวกลาง (รีเลย์) กล่าวคือ ICE จะใช้ STUN กับ UDP เพื่อเชื่อมต่อแอปเทียบเท่าโดยตรงก่อน และหากดำเนินการไม่สำเร็จ จะกลับไปใช้เซิร์ฟเวอร์การส่งต่อของ TURN นิพจน์การค้นหาตัวเลือกหมายถึงกระบวนการค้นหาอินเทอร์เฟซและพอร์ตเครือข่าย
Justin Uberti วิศวกร WebRTC ให้ข้อมูลเพิ่มเติมเกี่ยวกับ ICE, STUN และ TURN ในงานนำเสนอ Google I/O WebRTC ปี 2013 (สไลด์การนำเสนอมีตัวอย่างการใช้งานเซิร์ฟเวอร์ TURN และ STUN)
ไคลเอ็นต์วิดีโอแชทแบบง่าย
สถานที่ที่ดีในการทดลองใช้ WebRTC ที่มีฟีเจอร์การส่งสัญญาณและ NAT/ไฟร์วอลล์แบบข้ามผ่านโดยใช้เซิร์ฟเวอร์ STUN คือการสาธิตวิดีโอแชทที่ appr.tc แอปนี้ใช้ adapter.js ซึ่งเป็น Shim เพื่อป้องกันแอปจากการเปลี่ยนแปลงข้อมูลจำเพาะและความแตกต่างของคำนำหน้า
โค้ดจงใจกล่าวถึงรายละเอียดในการบันทึก ดูคอนโซลเพื่อให้เข้าใจลำดับของเหตุการณ์ ต่อไปนี้เป็นคำแนะนำโดยละเอียดของโค้ด
โทโพโลยีเครือข่าย
WebRTC อย่างที่ใช้อยู่ในปัจจุบัน รองรับการสื่อสารแบบหนึ่งต่อหนึ่งเท่านั้น แต่ก็ใช้ได้ในสถานการณ์ของเครือข่ายที่ซับซ้อนยิ่งขึ้น เช่น การสื่อสารระหว่างแอปเทียบเท่าหลายคนโดยตรง หรือผ่านหน่วยควบคุมหลายจุด (MCU) ซึ่งเป็นเซิร์ฟเวอร์ที่รองรับผู้เข้าร่วมจำนวนมาก และส่งต่อสตรีมบางส่วน รวมถึงการผสมหรือบันทึกเสียงและวิดีโอ
แอป WebRTC ที่มีอยู่จำนวนมากสาธิตการสื่อสารระหว่างเว็บเบราว์เซอร์เท่านั้น แต่เซิร์ฟเวอร์เกตเวย์สามารถอนุญาตให้แอป WebRTC ที่ทำงานในเบราว์เซอร์โต้ตอบกับอุปกรณ์ เช่น โทรศัพท์ (หรือที่เรียกว่า PSTN) และกับระบบ VOIP ในเดือนพฤษภาคม 2012 Doubango Telecom ได้เปิดตัวไคลเอ็นต์ SIP Sipml5 ที่สร้างขึ้นด้วย WebRTC และ WebSocket ซึ่ง (หนึ่งในการใช้งานอื่นๆ ที่เป็นไปได้) ช่วยให้สามารถโทรวิดีโอคอลระหว่างเบราว์เซอร์และแอปต่างๆ ที่ทำงานบน iOS และ Android ได้ Tethr และ Tropo ได้สาธิตกรอบการสื่อสารสำหรับภัยพิบัติ ในกระเป๋าเอกสาร ที่ Google I/O โดยใช้เซลล์ OpenBTS เพื่อเปิดใช้การสื่อสารระหว่างฟีเจอร์โฟนและคอมพิวเตอร์ผ่าน WebRTC การสื่อสารทางโทรศัพท์โดยไม่มีผู้ให้บริการ
RTCDataChannel
API<
WebRTC รองรับการสื่อสารแบบเรียลไทม์สำหรับข้อมูลประเภทอื่นๆ นอกเหนือจากเสียงและวิดีโอ
RTCDataChannel
API ช่วยให้แลกเปลี่ยนข้อมูลระหว่างเครื่องได้ระหว่างเครื่องกับเวลาในการตอบสนองต่ำและอัตราการส่งข้อมูลสูง โปรดดูการสาธิตแบบหน้าเดียวและวิธีสร้างแอปสำหรับโอนไฟล์อย่างง่ายได้ที่ตัวอย่าง WebRTC และ WebRTC Codelab ตามลำดับ
กรณีการใช้งาน API ที่เป็นไปได้มีหลายประการ ได้แก่
- เกม
- แอป Remote Desktop
- แชทข้อความแบบเรียลไทม์
- การโอนไฟล์
- เครือข่ายแบบกระจายศูนย์
API มีฟีเจอร์มากมายที่จะช่วยให้คุณใช้ RTCPeerConnection
ได้อย่างเต็มประสิทธิภาพ และช่วยให้การสื่อสารระหว่างเครื่องมีประสิทธิภาพและความยืดหยุ่นดังนี้
- ใช้ประโยชน์จากการตั้งค่าเซสชัน
RTCPeerConnection
- ช่องหลายช่องพร้อมกันพร้อมการจัดลำดับความสำคัญ
- อรรถศาสตร์ในการนำส่งที่เชื่อถือได้และไม่น่าเชื่อถือ
- การรักษาความปลอดภัยในตัว (DTLS) และการควบคุมความคับคั่ง
- ความสามารถในการใช้กับหรือไม่มีเสียงหรือวิดีโอ
ไวยากรณ์คล้ายกับ WebSocket ที่มีเมธอด send()
และเหตุการณ์ message
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 มากแม้ว่าจะต้องใช้เซิร์ฟเวอร์รีเลย์ (TURN) เมื่อเจาะรูเพื่อรับมือกับไฟร์วอลล์และ NAT ไม่สำเร็จ
RTCDataChannel
พร้อมใช้งานใน Chrome, Safari, Firefox, Opera และอินเทอร์เน็ตของ Samsung เกม Cube Slam ใช้ API ในการสื่อสารสถานะของเกม เล่นกับเพื่อนหรือเล่นหมี! แพลตฟอร์มล้ำสมัย Sharefest เปิดใช้การแชร์ไฟล์ผ่าน RTCDataChannel
และ peerCDN ทำให้เห็นภาพว่า WebRTC จะเปิดใช้การเผยแพร่เนื้อหาแบบเพียร์ทูเพียร์ได้อย่างไร
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ RTCDataChannel
โปรดดูข้อกำหนดโปรโตคอลฉบับร่างของ IETF
ความปลอดภัย
แอปหรือปลั๊กอินการสื่อสารแบบเรียลไทม์อาจส่งผลต่อความปลอดภัยได้หลายวิธี เช่น
- สื่อหรือข้อมูลที่ไม่ได้เข้ารหัสอาจถูกดักจับระหว่างเบราว์เซอร์หรือระหว่างเบราว์เซอร์และเซิร์ฟเวอร์
- แอปอาจบันทึกและเผยแพร่วิดีโอหรือเสียงโดยที่ผู้ใช้ไม่ทราบ
- มัลแวร์หรือไวรัสอาจติดตั้งอยู่ข้างๆ ปลั๊กอินหรือแอปที่ดูไม่เป็นอันตราย
WebRTC มีฟีเจอร์หลายอย่างที่ช่วยหลีกเลี่ยงปัญหาเหล่านี้
- การใช้ WebRTC ใช้โปรโตคอลที่ปลอดภัย เช่น DTLS และ SRTP
- คอมโพเนนต์ WebRTC ทั้งหมดรวมถึงกลไกการส่งสัญญาณจำเป็นต้องเข้ารหัส
- WebRTC ไม่ใช่ปลั๊กอิน คอมโพเนนต์ต่างๆ จะทำงานในแซนด์บ็อกซ์ของเบราว์เซอร์ ไม่ใช่ในกระบวนการที่แยกต่างหาก คอมโพเนนต์ไม่จำเป็นต้องมีการติดตั้งแยกต่างหากและได้รับการอัปเดตทุกครั้งที่มีการอัปเดตเบราว์เซอร์
- ต้องให้สิทธิ์การเข้าถึงกล้องและไมโครโฟนอย่างชัดเจน และอินเทอร์เฟซผู้ใช้จะแสดงข้อมูลนี้อย่างชัดเจนเมื่อกล้องหรือไมโครโฟนทำงาน
การอภิปรายฉบับเต็มเรื่องความปลอดภัยสำหรับสตรีมมิงสื่ออยู่นอกขอบเขตของบทความนี้ โปรดดูข้อมูลเพิ่มเติมที่หัวข้อสถาปัตยกรรมความปลอดภัย WebRTC ที่เสนอ ที่ IETF เสนอ
สรุป
API และมาตรฐานของ WebRTC สามารถทำให้เครื่องมือเป็นแบบประชาธิปไตยและกระจายศูนย์สำหรับการสร้างและการสื่อสาร รวมถึงโทรศัพท์ เกม การผลิตวิดีโอ การทำเพลง และการรวบรวมข่าว
เทคโนโลยีไม่ได้รบกวนมากไปกว่านี้
ดังที่บล็อกเกอร์ Phil Edholm บอกไว้ " WebRTC และ HTML5 สามารถทำให้เกิดการเปลี่ยนรูปแบบการสื่อสารแบบเรียลไทม์แบบเดียวกันที่เบราว์เซอร์เดิมทำเพื่อข้อมูลได้"
เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์
- คุณสามารถดูสถิติ WebRTC สำหรับเซสชันที่ดำเนินอยู่ได้ที่:
- about://webrtc-internals ใน Chrome
- opera://webrtc-internals ใน Opera
- about:webrtc ใน Firefox
- หมายเหตุการทำงานร่วมกันข้ามเบราว์เซอร์
- adapter.js เป็น JavaScript Shim สำหรับ WebRTC ที่ดูแลโดย Google ด้วยความช่วยเหลือจากชุมชน WebRTC ที่แทรกคำนำหน้าผู้ให้บริการ ความแตกต่างของเบราว์เซอร์ และการเปลี่ยนแปลงข้อกำหนด
- หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับกระบวนการส่งสัญญาณ WebRTC โปรดตรวจสอบเอาต์พุตของบันทึก appr.tc ไปยังคอนโซล
- หากทั้งหมดมากเกินไป คุณอาจอยากใช้เฟรมเวิร์ก WebRTC หรือแม้กระทั่งบริการ WebRTC ทั้งหมด
- เรายินดีที่ได้รับรายงานข้อบกพร่องและคำขอฟีเจอร์เสมอ
ดูข้อมูลเพิ่มเติม
- เซสชัน WebRTC ของ Justin Uberti ที่ Google I/O 2012
- อลัน บี. Johnston และ Daniel C. Burnett รักษาหนังสือ WebRTC ที่ขณะนี้เป็นฉบับที่ 3 ในรูปแบบสิ่งพิมพ์และ eBook ที่ webrtcbook.com
- webrtc.org เป็นศูนย์รวมทุกสิ่งเกี่ยวกับ WebRTC รวมถึงการสาธิต เอกสารประกอบ และการสนทนา
- discuss-webrtc เป็น Google Group สำหรับการสนทนาทางเทคนิคเกี่ยวกับ WebRTC
- @webrtc
- เอกสารประกอบใน Talk ของ Google Developers ให้ข้อมูลเพิ่มเติมเกี่ยวกับ NAT Traversal, STUN, รีเลย์เซิร์ฟเวอร์ และการรวบรวมผู้สมัคร
- WebRTC บน GitHub
- Stack Overflow เป็นที่ที่ดีในการค้นหาคำตอบและถามคำถามเกี่ยวกับ WebRTC
มาตรฐานและโปรโตคอล
- ฉบับร่างของผู้แก้ไข WebRTC W3C
- ฉบับร่างของ W3C Editor: การจับภาพและสตรีมสื่อ (หรือที่เรียกว่า
getUserMedia
) - กฎบัตรคณะทำงาน IETF
- ฉบับร่างโปรโตคอลช่องข้อมูล WebRTC ของ IETF
- ฉบับร่าง IETF JSEP
- มาตรฐาน IETF ที่เสนอสำหรับ ICE
- คณะทำงานเกี่ยวกับอินเทอร์เน็ตฉบับร่างของ IETF RTCWEB: กรณีการใช้งานและข้อกำหนดของการสื่อสารแบบเรียลไทม์บนเว็บ
ข้อมูลสรุปการสนับสนุน WebRTC
MediaStream
และ getUserMedia
API
- Chrome สำหรับเดสก์ท็อป 18.0.1008 ขึ้นไป Chrome สำหรับ Android 29 ขึ้นไป
- Opera 18 ขึ้นไป Opera สำหรับ Android 20 ขึ้นไป
- Opera 12, Opera Mobile 12 (ขึ้นอยู่กับเครื่องมือ Presto)
- Firefox 17 ขึ้นไป
- Microsoft Edge 16 ขึ้นไป
- Safari 11.2 ขึ้นไปใน iOS และ 11.1 ขึ้นไปใน MacOS
- UC 11.8 ขึ้นไปใน Android
- Samsung Internet 4 และสูงกว่า
API ของ RTCPeerConnection
- Chrome Desktop 20 ขึ้นไป Chrome สำหรับ Android 29 ขึ้นไป (ไม่มีธง)
- Opera 18 ขึ้นไป (เปิดอยู่โดยค่าเริ่มต้น) Opera สำหรับ Android 20 ขึ้นไป (เปิดอยู่โดยค่าเริ่มต้น)
- Firefox 22 ขึ้นไป (เปิดอยู่โดยค่าเริ่มต้น)
- Microsoft Edge 16 ขึ้นไป
- Safari 11.2 ขึ้นไปใน iOS และ 11.1 ขึ้นไปใน MacOS
- Samsung Internet 4 และสูงกว่า
API ของ RTCDataChannel
- เวอร์ชันทดลองใน Chrome 25 แต่เสถียรกว่า (และความสามารถในการทำงานร่วมกันของ Firefox) ใน Chrome 26 ขึ้นไป Chrome สำหรับ Android 29 ขึ้นไป
- เวอร์ชันเสถียร (และความสามารถในการทำงานร่วมกันของ Firefox) ใน Opera 18 ขึ้นไป Opera สำหรับ Android 20 ขึ้นไป
- Firefox 22 ขึ้นไป (เปิดอยู่โดยค่าเริ่มต้น)
โปรดดูข้อมูลโดยละเอียดเกี่ยวกับการรองรับ API ข้ามแพลตฟอร์ม เช่น getUserMedia
และ RTCPeerConnection
ได้ที่ caniuse.com และสถานะแพลตฟอร์ม Chrome
นอกจากนี้ API ที่มาพร้อมเครื่องสำหรับ RTCPeerConnection
ยังสามารถดูได้ที่เอกสารประกอบเกี่ยวกับ webrtc.org