
如果你在做网页端录音/录屏,或者要抓摄像头画面导出成文件,RecordRTC 是个挺省心的选择。它把底层的 MediaRecorder、WebRTC 这堆 API 做了个更顺手的封装,API 比较直白,上手也不难。
项目地址
- GitHub:https://github.com/muaz-khan/RecordRTC
- NPM:
recordrtc
能做什么
- 音频录制(麦克风)
- 视频录制(摄像头、屏幕共享)
- 同时录制音视频
- 支持多种容器/编码(浏览器能力决定,常见 WebM/Opus/VP8/VP9 等)
- 提供 Blob、URL、下载等多种导出方式
快速上手
下面的两段代码直接来自官方 README,分别演示 Promise 风格与常规写法:
// 使用 Promise 风格的示例(来自官方 README)
let stream = await navigator.mediaDevices.getUserMedia({video: true, audio: true});
let recorder = new RecordRTCPromisesHandler(stream, {
type: 'video'
});
recorder.startRecording();
const sleep = m => new Promise(r => setTimeout(r, m));
await sleep(3000);
await recorder.stopRecording();
let blob = await recorder.getBlob();
invokeSaveAsDialog(blob);
// 常规写法示例(来自官方 README)
navigator.mediaDevices.getUserMedia({
video: true,
audio: true
}).then(async function(stream) {
let recorder = RecordRTC(stream, {
type: 'video'
});
recorder.startRecording();
const sleep = m => new Promise(r => setTimeout(r, m));
await sleep(3000);
recorder.stopRecording(function() {
let blob = recorder.getBlob();
invokeSaveAsDialog(blob);
});
});
说明:
invokeSaveAsDialog
为示例中的保存方法(RecordRTC 提供的下载工具),你也可以改为自定义下载/上传逻辑。
使用小贴士
- 权限与兼容性:录音/录屏都需要 HTTPS 环境与用户授权;Safari 的 MediaRecorder 支持相对弱,必要时考虑降级策略。
- 容器与编码:
mimeType
尽量和浏览器支持对齐,video/webm;codecs=vp8
、audio/webm;codecs=opus
是常见组合。 - 音频双声道:只在确有需求时开启,多数语音场景单声道更省带宽/体积。
- 录制时长与内存:长时间录制建议分段写出,避免大 Blob 挤爆内存。
- 上传后端:后端可直接收 Blob(multipart/form-data),存储为 WebM/MP4 等;如需转码可用 FFmpeg。
配置说明(常用 Options)
下面列一些在实际项目里最常用、也最容易搞混的配置项(不同记录器支持的字段会略有差异):
type
:整体录制类型提示,常见有audio
、video
、canvas
、gif
。mimeType
:容器与编码,比如:- 音频常用:
audio/webm;codecs=opus
、audio/ogg;codecs=opus
(取决于浏览器)。 - 视频常用:
video/webm;codecs=vp8
或vp9
。
- 音频常用:
bitsPerSecond
/videoBitsPerSecond
/audioBitsPerSecond
:码率,影响文件体积与清晰度。numberOfAudioChannels
:1 或 2。语音类建议 1。sampleRate
/desiredSampRate
:采样率,常见 44100/48000。timeSlice
:按固定间隔抛出数据块(配合ondataavailable
),适合“边录制边上传”。disableLogs
:关闭库内日志。
RecordRTC 支持多种“记录器(Recorder)”,可以显式选择,也可以让库自动挑:
StereoAudioRecorder
:基于 WebAudio,适合音频录制;MediaStreamRecorder
:基于 MediaRecorder,音视频通用;WhammyRecorder
:用 Whammy 将帧拼成 WebM(更像兼容兜底方案);CanvasRecorder
:录制<canvas>
内容;GifRecorder
:导出 GIF(体积通常较大)。
示例:分段录制并上传(更抗内存占用,也方便断点续传):
const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: false });
const recorder = new RecordRTC(stream, {
type: 'audio',
mimeType: 'audio/webm;codecs=opus',
numberOfAudioChannels: 1,
timeSlice: 5000, // 每 5s 产出一段
ondataavailable: async (blob) => {
// 直接把分片往后端推
const form = new FormData();
form.append('chunk', blob, `part-${Date.now()}.webm`);
await fetch('/upload', { method: 'POST', body: form });
}
});
recorder.startRecording();
// ... 结束录制
recorder.stopRecording(() => {
// 可选:处理最后一段,或合并标记
stream.getTracks().forEach(t => t.stop());
});
如果你要手动选择 Recorder 实现,也可以这样:
const r = new RecordRTC.StereoAudioRecorder(stream, {
mimeType: 'audio/webm',
numberOfAudioChannels: 1
});
r.record();
r.stop((blob) => { /* ... */ });
浏览器兼容性(精炼总结)
- HTTPS 与权限:
getUserMedia
/getDisplayMedia
需要安全上下文(HTTPS)与用户授权。 - Chrome / Edge(Chromium):对 MediaRecorder、WebM/Opus/VP8 支持好;系统音频的屏幕录制支持依赖平台版本。
- Firefox:整体兼容不错,但某些
mimeType
或码率组合会与 Chromium 略有差异。 - Safari(含 iOS):MediaRecorder 支持相对保守,容器/编码选择更受限;iOS 的系统限制更多(例如后台录制、文件大小、自动播放策略)。
- 屏幕录制:
getDisplayMedia
在主流现代浏览器已支持,但系统音频采集是否可用与 OS/浏览器版本相关。 - 下载/播放:部分移动端对
blob:
URL、自动播放策略较敏感,实践中建议点击触发播放。
小建议:兼容策略里加一个 canRecord(mimeType)
的探测步骤,按浏览器能力回退。例如:
function pickSupportedMime(candidates) {
const m = window.MediaRecorder;
if (!m) return '';
return candidates.find(t => m.isTypeSupported?.(t)) || '';
}
const mime = pickSupportedMime([
'audio/webm;codecs=opus',
'audio/ogg;codecs=opus',
'audio/webm',
]);
const recorder = new RecordRTC(stream, { type: 'audio', mimeType: mime || undefined });
适用场景
- 在线课程/面试系统里的“录音答题/录屏作业”
- 客服或表单内的“语音留言/视频留言”
- 团队内“快速录屏说明问题”的小工具
- Web 端 Demo、Bug 复现录像
小结
RecordRTC 的定位很务实:把浏览器已有的录制能力封装得更顺手。对于常见的录音/录屏需求,它能让你少踩坑、快落地。如果你后续要做更复杂的采集/推流(比如和 RTC 实时互动结合、服务端录制、云端转码等),也可以在此基础上再扩展方案。
标签
版权声明
本文由 WebRTC.link 创作,采用 CC BY-NC-SA 4.0 许可协议。本站转载文章会注明来源以及作者。如果您需要转载,请注明出处以及作者。
评论区
Giscus评论由 Giscus 驱动,基于 GitHub Discussions