You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:10:30