Eksperimen saya terkait penggunaan WebRTC untuk membuat Video Conference Meeting seperti Google Meet dan Zoom.
WebRTC adalah teknologi web modern yang memungkinkan terjadinya komunikasi real time dalam sebuah aplikasi Web. Komunikasi yang dimaksud dapat berupa pengiriman video, suara maupun data lainnya.
WebRTC memungkinkan adanya pertukaran data langsung antara 2 client (peer to peer) tanpa memerlukan bantuan server untuk me-relay data. Namun, komunikasi P2P kadang terhalang oleh NAT atau Network Address Translation sehingga device tidak bisa berkomunikasi langsung karena tidak mengetahui IP yang bisa diakses secara langsung oleh device lain.
Disinilah perlunya peran STUN yang bisa mendapatkan informasi IP Publik yang bisa digunakan. Jika STUN gagal untuk dapat digunakan maka solusi lainnya adalah WebRTC akan menggunakan TURN sebagai server relay data.
Untuk memulai koneksi peer menggunakan WebRTC ada beberapa hal yang perlu dilakukan:
Client 1 memerlukan media yang akan dikirim ke client 2. Disini kita bisa menggunakan navigator.mediaDevices.getUserMedia
untuk mengambil kamera dan audio dari device, atau navigator.mediaDevices.getDisplayMedia
untuk mendapatkan screen capture dari device. Hasil capture media ini akan menghasilkan sebuah MediaStream
.
Client 1 melakukan inisialisasi RTCPeerConnection
. Dan menambahkan MediaStream
yang sudah di-capture ke koneksi peer dengan addTrack
.
Meskipun WebRTC dapat mengirimkan media secara langsung tanpa bantuan server. Kita memerlukan sebuah server untuk melakukan signaling (pertukaran informasi terkait bagaimana masing-masing Client dapat berkomunikasi). Sebenarnya, proses signaling ini pun secara teori juga dapat dilakukan tanpa menggunakan server. Seperti melakan generate Kode QR pada pengirim dan melakukan scanning Kode QR pada penerima.
Pada proyek ini saya menggunakan server WebSocket dengan bahasa Go.
-
Ketika Client 1 pertama kali melakukan inisialisasi koneksi peer dengan Client 2, Client 1 perlu melakukan negosiasi dengan Client 2. Apakah Client 2 akan menerima permintaan koneksi P2P dari Client 1.
Di
RTCPeerConnection
yang sudah dibuat kita perlu melakukan handling eventonnegotiationneeded
. Di handler event tersebut kita perlu mengambil informasi SDP dari Client 1 (informasi terkait network dan lainnya) dengan memanggilcreateOffer
dariRTCPeerConnection
yang telah dibuat. Lalu memanggilsetLocalDescription
untuk menyimpan informasi SDP lokal kita ke dalam peer. -
Client 1 perlu mengirimkan informasi SDP nya ke Client 2. Di sinilah server signaling berguna. Informasi SDP Client 1 dikirimkan ke Client 2 melalui WebSocket.
-
Client 2 akan menerima informasi SDP Client 1 dari WebSocket. Lalu Client 2 juga melakukan inisialisasi
RTCPeerConnection
dan mengatur informasi SDP Client 1 ke peer dengan menggunakan fungsisetRemoteDescription
. -
Client 2 perlu mengirimkan informasi SDP nya juga ke Client 1. Dengan menggunakan fungsi
createAnswer
dariRTCPeerConnection
dan mengatur local description peer-nya dengan menggunakan fungsisetLocalDescription
.Selanjutnya answer tersebut perlu dikirimkan oleh Client 2 ke Client 1 dengan protokol signaling (WebSocket).
-
Client 1 menerima answer (informasi SDP) Client 2 dari WebSocket dan mengatur remote description di
RTCPeerConnection
Client 1 dengansetRemoteDescription
. -
Browser akan mencari tahu cara terbaik bagaimana client dapat terhubung satu sama lain. Masing-masing client perlu meng-handle event
onicecandidate
dariRTCPeerConnection
.ICE Candidate yang sudah didapatkan perlu dikirim ke client lain menggunakan WebSocket.
Client yang menerima informasi ICE Candidate dari WebSocket lalu memasukannya ke
RTCPeerConnection
dengan menggunakan fungsiaddIceCandidate
. -
Masing-masing client perlu meng-handle event
ontrack
untuk menyimpanMediaStream
dari client lain sehingga dapat ditampilkan di Browser.Misalnya kita menerima video, kita dapat mengatur
srcObject
dari elemen video tersebut dari javascript menjadiMediaStream
yang telah didapatkan.
- Satu koneksi WebRTC bisa digunakan kedua belah pihak untuk mengirim dan menerima beberapa media dan data. Artinya anda cukup memanggil
addTrack
jika ingin menambahkan audio atau video yang dikirimkan ke client lainnya. - Anda dapat melihat source code dari file gomeet-fe/src/lib/Rooms.Class.ts untuk melihat implementasi WebRTC ini.
- Screen Capture saat ini hanya tersedia di browser desktop.
- Hak akses ke kamera, audio dan Screen Capture hanya bisa dilakukan di secure connection atau https dan di localhost.
- Disini saya menggunakan STUN server dari google (bisa dilihat di gomeet-fe/src/lib/peer.ts) dan bekerja pada untuk koneksi P2P antar device dalam lokal network saya.
- Ketika menggunakan jaringan kartu SIM Mobile biasa (setidaknya untuk provider yang saya gunakan), saya harus menggunakan server TURN agar koneksi P2P dapat bekerja. Anda dapat mencoba server TURN gratis dari metered.ca