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

如何用Twilio Video与JavaScript编程控制录制至外部S3桶?

如何用Twilio Video + JavaScript编程控制录制启停并存储到S3桶

完全可以实现自主控制录制时机,Twilio提供了API来手动启动/停止视频房间的录制,下面是具体的实现步骤和代码示例:

核心前提

  • 已启用Twilio Video服务,获取了Account SID和Auth Token(注意:Auth Token绝不能暴露在前端代码中)
  • 拥有AWS S3桶,且配置了允许Twilio写入的IAM权限
  • 后端服务(这里用Node.js/Express举例),用来安全调用Twilio API

步骤1:配置S3存储集成

在Twilio控制台完成S3存储配置,让录制文件自动上传到你的S3桶:

  • 进入Twilio控制台的「Settings」→「Storage」
  • 点击「Add new storage」选择Amazon S3
  • 填写S3桶名称、AWS区域,以及具备s3:PutObject权限的IAM角色ARN
  • 保存配置后,后续所有录制文件都会自动上传到该S3桶

步骤2:后端实现录制控制接口

因为前端不能直接调用Twilio API(会泄露Auth Token),所以需要后端封装接口来触发启停:

安装依赖

npm install twilio express cors

后端代码示例

const express = require('express');
const twilio = require('twilio');
const cors = require('cors');

const app = express();
app.use(cors());
app.use(express.json());

// Twilio配置(从环境变量读取,不要硬编码)
const accountSid = process.env.TWILIO_ACCOUNT_SID;
const authToken = process.env.TWILIO_AUTH_TOKEN;
const client = twilio(accountSid, authToken);

// 启动录制接口
app.post('/api/start-recording', async (req, res) => {
  const { roomSid } = req.body;
  try {
    const recording = await client.video.recordings.create({
      roomSid: roomSid,
      format: 'mp4', // 可选:webm/mp4
      statusCallback: 'https://your-server.com/api/recording-status' // 可选:录制状态回调
    });
    res.json({ success: true, recordingSid: recording.sid });
  } catch (error) {
    res.status(500).json({ success: false, error: error.message });
  }
});

// 停止录制接口
app.post('/api/stop-recording', async (req, res) => {
  const { recordingSid } = req.body;
  try {
    await client.video.recordings(recordingSid).update({ status: 'stopped' });
    res.json({ success: true });
  } catch (error) {
    res.status(500).json({ success: false, error: error.message });
  }
});

// 可选:录制状态回调接口
app.post('/api/recording-status', (req, res) => {
  const { Status, RecordingSid, MediaUrl } = req.body;
  // 这里可以处理录制完成/失败的逻辑,比如通知用户、更新数据库等
  console.log(`Recording ${RecordingSid} status: ${Status}`);
  res.sendStatus(200);
});

app.listen(3000, () => console.log('Server running on port 3000'));

步骤3:前端触发录制控制

在你的前端JavaScript代码中,通过调用后端接口来控制录制:

// 假设已经创建了Twilio Video Room实例
let currentRoom;
let currentRecordingSid;

// 启动录制按钮点击事件
document.getElementById('start-recording-btn').addEventListener('click', async () => {
  if (!currentRoom) return;
  const response = await fetch('http://your-server.com/api/start-recording', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ roomSid: currentRoom.sid })
  });
  const data = await response.json();
  if (data.success) {
    currentRecordingSid = data.recordingSid;
    alert('录制已启动');
  } else {
    alert(`启动失败:${data.error}`);
  }
});

// 停止录制按钮点击事件
document.getElementById('stop-recording-btn').addEventListener('click', async () => {
  if (!currentRecordingSid) return;
  const response = await fetch('http://your-server.com/api/stop-recording', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ recordingSid: currentRecordingSid })
  });
  const data = await response.json();
  if (data.success) {
    currentRecordingSid = null;
    alert('录制已停止,文件将上传到你的S3桶');
  } else {
    alert(`停止失败:${data.error}`);
  }
});

// 初始化Twilio Video Room的示例代码
async function joinRoom() {
  const token = await fetch('http://your-server.com/api/get-token').then(res => res.json());
  currentRoom = await Twilio.Video.connect(token.token);
  console.log('Joined room:', currentRoom.sid);
}

关键注意事项

  • 确保后端的Twilio凭证从环境变量读取,不要硬编码到代码中
  • S3桶的IAM角色必须正确配置,允许Twilio的服务主体写入,否则录制文件无法上传
  • 录制启动后,即使所有参与者离开房间,录制也会继续,直到你调用停止接口或Twilio自动超时(默认4小时)
  • 可以通过Twilio API或控制台查看录制的状态和文件路径

内容的提问来源于stack exchange,提问作者Ashish Binu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 20:24:32