WHIP/WHEP primary stream Β· HLS fallback Β· VP9 / H.264 / Opus Β· Socket.IO signaling Β· MediaRecorder S3 recording
WebRTC (Web Real-Time Communication) is de kern van alle real-time audio/video features op TeezU v7.0. Primaire ingest via WHIP, delivery via WHEP β met HLS als automatische fallback voor legacy clients. Signaling verloopt via Socket.IO (niet raw WebSocket).
Sub-second latency via WebRTC Ingestion/Egress Protocol. OBS β WHIP β MediaSoup SFU β WHEP kijkers.
Opus audio met echo cancellation. Tot 4 simultane deelnemers in collab stream mode via SFU.
getDisplayMedia() voor screen sharing. MediaRecorder β 10s segmenten β AWS S3 via Fastify presigned URLs.
Standaard WebRTC ingest/egress protocol. Browser-native, geen plugin. <300ms end-to-end latency.
Automatische fallback voor legacy browsers & TV's. 5β10s latency, adaptive bitrate 360p/720p/1080p.
Server-side state machine via Fastify. LIVE β FROZEN (blauwe glow) β REVEAL (confetti animatie).
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β CLIENT A β
β ββββββββββββ ββββββββββββ ββββββββββββ β
β β Browser ββ βMediaStreamββ βRTCPeerConβ β
β β API β β API β β nection β β
β ββββββββββββ ββββββββββββ ββββββ¬ββββββ β
ββββββββββββββββββββββββββββββββββββββΌββββββββββββ
β
ββββββββββββββββββββββββββββββ
β SIGNALING SERVER β
β (Socket.io) β
β - Offer/Answer β
β - ICE Candidates β
ββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββββββββββββββββββΌββββββββββββ
β CLIENT B β β
β ββββββββββββ ββββββββββββ βββββ΄βββββββ β
β β Browser ββ βMediaStreamββ βRTCPeerConβ β
β β API β β API β β nection β β
β ββββββββββββ ββββββββββββ ββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
Direct P2P Connection (when possible)
Client A β Client B
TURN Relay (when NAT/firewall blocks P2P)
Client A β TURN Server β Client B
De core WebRTC API voor peer-to-peer verbindingen.
Toegang tot camera, microfoon en scherm.
Socket.io server voor SDP exchange en ICE candidates.
NAT traversal en relay servers.
// ICE Server Configuration (v7.0)
const config = {
iceServers: [
// Google STUN servers (free, discover public IP)
{ urls: 'stun:stun.l.google.com:19302' },
{ urls: 'stun:stun1.l.google.com:19302' },
// Custom TeezU STUN server
{ urls: 'stun:stun.teezu.online:3478' },
// TURN relay server (NAT traversal fallback)
{
urls: [
'turn:turn.teezu.online:3478',
'turn:turn.teezu.online:5349?transport=tcp' // TCP fallback
],
username: 'teezu',
credential: process.env.TURN_SECRET
}
],
iceTransportPolicy: 'all', // Try P2P first, TURN as fallback
bundlePolicy: 'max-bundle',
rtcpMuxPolicy: 'require'
};
const peerConnection = new RTCPeerConnection(config);
// Signaling via Socket.IO (niet raw WebSocket)
socket.emit('webrtc:offer', { sdp: offer, roomId });
socket.on('webrtc:answer', ({ sdp }) => pc.setRemoteDescription(sdp));
socket.on('webrtc:ice', ({ candidate }) => pc.addIceCandidate(candidate));
Automatische aanpassing van kwaliteit op basis van netwerk condities.
Advanced audio features voor betere spraakkwaliteit.
WebRTC Ingestion Protocol (WHIP) voor uploaden, WebRTC Egress Protocol (WHEP) voor kijkers β sub-second latency.
Automatische fallback voor kijkers die geen WebRTC ondersteunen (oudere browsers, smart TV's).
Via getDisplayMedia() API β kies scherm, venster of browser-tab.
// Screen share initialiseren
const screenStream = await navigator.mediaDevices
.getDisplayMedia({
video: {
cursor: 'always',
displaySurface: 'browser',
frameRate: { ideal: 30 }
},
audio: true // System audio (Chrome only)
});
// Vervang video track in peer connection
const sender = pc.getSenders()
.find(s => s.track?.kind === 'video');
await sender.replaceTrack(
screenStream.getVideoTracks()[0]
);
MediaRecorder neemt 10s segmenten op en uploadt naar S3 via Fastify presigned URLs.
// MediaRecorder setup
const recorder = new MediaRecorder(stream, {
mimeType: 'video/webm;codecs=vp9,opus'
});
let segmentId = 0;
// Segment elke 10s uploaden naar S3
recorder.ondataavailable = async (e) => {
if (e.data.size > 0) {
await uploadSegmentToS3(
e.data,
segmentId++
);
}
};
recorder.start(10_000); // 10s segmenten
Collaborative livestreams met tot 4 gelijktijdige participant-streams via MediaSoup SFU.
Server-side state machine beheerd via Fastify. Creator controleert stream visibility in real-time.
// Stream states (server-side Fastify)
// LIVE β Normale stream
// FROZEN β Video gepauzeerd (blauwe glow)
// Audio blijft actief voor kijkers
// REVEAL β FROZEN β LIVE (confetti animatie)
// OFFLINE β Stream beΓ«indigd
// Client emits (creator controls)
socket.emit('stream:freeze', { streamId });
socket.emit('stream:reveal', { streamId });
// Server broadcast β alle kijkers
socket.on('stream:state', ({ state }) => {
if (state === 'FROZEN') applyBlueGlow();
if (state === 'REVEAL') triggerConfetti();
updateStreamOverlay(state);
});