如何用Node.js将WebRTC流保存至服务器文件?
WebRTC流录制并保存到Node.js服务器方案
因为Node.js本身没有浏览器端的MediaRecorder API,所以需要客户端先录制流,再把录制数据传输到服务器保存,具体实现分两步:
1. 客户端录制并传输流数据
在ontrack回调中拿到WebRTC流后,用浏览器的MediaRecorder录制,再通过WebSocket(推荐实时传输)把数据块发给服务器:
webrtc_connection.ontrack = async (e) => { const stream = e.streams[0]; // 初始化MediaRecorder,指定输出格式(webm兼容性较好) const mediaRecorder = new MediaRecorder(stream, { mimeType: 'video/webm' }); // 建立与服务器的WebSocket连接 const socket = new WebSocket('ws://你的服务器地址:8080'); // 每次录制生成数据块时,发送给服务器 mediaRecorder.ondataavailable = (event) => { if (event.data.size > 0) { socket.send(event.data); } }; // 录制停止时关闭WebSocket连接 mediaRecorder.onstop = () => { socket.close(); }; // 开始录制,每1秒生成一个数据块(可按需调整间隔) mediaRecorder.start(1000); };
2. Node.js服务器接收并保存文件
用ws库接收客户端传来的二进制数据,写入服务器本地文件:
步骤1:安装依赖
npm install ws
步骤2:服务器代码
const WebSocket = require('ws'); const fs = require('fs'); const path = require('path'); // 创建WebSocket服务器,监听8080端口 const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', (ws) => { console.log('客户端已连接'); // 创建可写流,将数据追加到目标文件 const videoStream = fs.createWriteStream(path.join(__dirname, 'recorded.webm'), { flags: 'a' }); // 接收客户端发来的二进制数据,写入文件 ws.on('message', (data) => { videoStream.write(data); }); // 客户端断开连接时,关闭文件流 ws.on('close', () => { console.log('客户端断开连接'); videoStream.end(); }); // 处理错误,避免文件流异常 ws.on('error', (err) => { console.error('连接错误:', err); videoStream.end(); }); }); console.log('WebSocket服务器运行在 ws://localhost:8080');
注意事项
- 确保客户端和服务器使用的媒体格式一致(如示例中的
video/webm),否则文件无法正常播放; - 可提前用
MediaRecorder.isTypeSupported()检测格式兼容性,适配更多浏览器; - 若不使用WebSocket,也可以通过HTTP分块上传(如
fetch发送Blob数据),但WebSocket更适合实时传输场景; - 生产环境需添加身份验证、异常重试机制,避免数据丢失或非法访问。
内容的提问来源于stack exchange,提问作者Hypothesis
相关产品推荐
相关产品推荐

