Overview
Record video from WebRTC/MediaStream sources:
- Video conferencing recordings
- Screen recordings
- Camera feeds
- Live streaming archives
This guide shows the encoding side. For capturing MediaStream data in Node.js, you’ll need platform-specific capture tools or receive data from a browser.
const { VideoEncoder, VideoFrame } = require('node-webcodecs');
async function recordMediaStream(mediaStreamFrames) {
const chunks = [];
const encoder = new VideoEncoder({
output: (chunk) => {
const buffer = Buffer.alloc(chunk.byteLength);
chunk.copyTo(buffer);
chunks.push(buffer);
},
error: (err) => { throw err; }
});
encoder.configure({
codec: 'avc1.42E01E',
width: 1920,
height: 1080,
bitrate: 5_000_000,
framerate: 30,
latencyMode: 'realtime' // Low latency for live recording
});
for (const frameData of mediaStreamFrames) {
const frame = new VideoFrame(frameData.data, {
format: 'RGBA',
codedWidth: 1920,
codedHeight: 1080,
timestamp: frameData.timestamp
});
encoder.encode(frame);
frame.close();
}
await encoder.flush();
encoder.close();
return Buffer.concat(chunks);
}
Real-Time Encoding
For live streams, use real-time encoding mode:
const encoder = new VideoEncoder({
output: (chunk) => {
// Send to live stream server
streamServer.send(chunk);
},
error: (err) => { throw err; }
});
encoder.configure({
codec: 'avc1.42E01E',
width: 1280,
height: 720,
bitrate: 3_000_000,
framerate: 30,
latencyMode: 'realtime', // ← Optimize for low latency
bitrateMode: 'constant' // ← CBR for streaming
});
Best Practices
- Use realtime latency mode
- Use constant bitrate (CBR)
- Handle dropped frames gracefully
- Buffer output to handle network jitter
Next Steps