RecordRTC:浏览器端录音/录屏的靠谱工具(项目概览与上手)

RTC相关项目 6 分钟 |
RecordRTC:浏览器端录音/录屏的靠谱工具(项目概览与上手)

如果你在做网页端录音/录屏,或者要抓摄像头画面导出成文件,RecordRTC 是个挺省心的选择。它把底层的 MediaRecorder、WebRTC 这堆 API 做了个更顺手的封装,API 比较直白,上手也不难。

项目地址

能做什么

  • 音频录制(麦克风)
  • 视频录制(摄像头、屏幕共享)
  • 同时录制音视频
  • 支持多种容器/编码(浏览器能力决定,常见 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=vp8audio/webm;codecs=opus 是常见组合。
  • 音频双声道:只在确有需求时开启,多数语音场景单声道更省带宽/体积。
  • 录制时长与内存:长时间录制建议分段写出,避免大 Blob 挤爆内存。
  • 上传后端:后端可直接收 Blob(multipart/form-data),存储为 WebM/MP4 等;如需转码可用 FFmpeg。

配置说明(常用 Options)

下面列一些在实际项目里最常用、也最容易搞混的配置项(不同记录器支持的字段会略有差异):

  • type:整体录制类型提示,常见有 audiovideocanvasgif
  • mimeType:容器与编码,比如:
    • 音频常用:audio/webm;codecs=opusaudio/ogg;codecs=opus(取决于浏览器)。
    • 视频常用:video/webm;codecs=vp8vp9
  • 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 实时互动结合、服务端录制、云端转码等),也可以在此基础上再扩展方案。

标签

#RecordRTC #WebRTC #录音 #录屏 #MediaRecorder

版权声明

本文由 WebRTC.link 创作,采用 CC BY-NC-SA 4.0 许可协议。本站转载文章会注明来源以及作者。如果您需要转载,请注明出处以及作者。

评论区

Giscus

评论由 Giscus 驱动,基于 GitHub Discussions

相关文章

探索更多相关内容,深入了解 WebRTC 技术的各个方面

演示 Demo

LIVE

基础摄像头访问

展示如何使用 getUserMedia API 获取摄像头和麦克风

媒体获取 体验

PTZ 摄像头控制

控制支持 PTZ 功能的摄像头进行平移、倾斜和缩放

媒体获取 体验

屏幕共享

使用 getDisplayMedia API 进行屏幕共享

媒体获取 体验