如何用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
相关产品推荐
相关产品推荐

