线上预览地址:https://deec.cc

typedoc地址:https://jianli.pnote.net/record/docs

1. 背景

随着线上会议以及在线协作的工作模式呈现爆发式增长,WebRTC的跨平台应用场景越来越多,例如屏幕共享、音视频会议、会议录制、远程教学、远程面试等

2. 目标

  1. 简化mediaDevicesMediaRecorder相关API的调用方式
  2. 支持录制时长的计算
  3. 支持屏幕和麦克风同时录制
  4. 支持导出录制文件,支持h264vp8/9,例如video/mp4audio/wavaudio/ogg等常见格式
  5. 录制前需支持分辨率选择、麦克风开关、摄像头切换、屏幕选择等
  6. 录制后的媒体流需支持去除视频背景、视频过渡效果、视频转场效果等
  7. 通过IndexedDB离线存储媒体文件
  8. 使用WebAssembly支持更多的编码类型

3. 实现思路

  1. 封装摄像头媒体流、屏幕媒体流、录制的API

  2. 预加载摄像头和麦克风相关权限和媒体设备列表

  3. 合并摄像头的音频流到屏幕媒体流中

  4. 使用requestAnimationFrame精确计算录制时长,包括暂停录制、重新录制等情况

  5. 根据mimeType适配更多编码类型,例如video/mp4audio/wavaudio/ogg等常见格式

  6. 处理多视频流,如屏幕流中显示摄像头画面、去除视频背景、视频过渡效果、视频转场效果等

  7. 音频流的回声处理和麦克风降噪

4. 结构图

recorder

5. 目录结构

├── docs
│   ├── assets
│   │   ├── highlight.css
│   │   ├── icons.css
│   │   ├── icons.png
│   │   ├── icons@2x.png
│   │   ├── main.js
│   │   ├── search.js
│   │   ├── style.css
│   │   ├── widgets.png
│   │   └── widgets@2x.png
│   ├── classes
│   │   ├── Camera.html
│   │   └── Recorder.html
│   ├── enums
│   │   ├── CameraType.html
│   │   ├── PhysicalPosition.html
│   │   ├── STATUS.html
│   │   └── ShapeKind.html
│   ├── .nojekyll
│   ├── index.html
│   └── modules.html
├── example
│   ├── index.html
│   └── index.ts
├── lib	#	build后的,包含声明文件
│   ├── utils
│   │   ├── camera.d.ts
│   │   ├── canvas.d.ts
│   │   └── utils.d.ts
│   ├── enums.d.ts
│   ├── index.d.ts
│   ├── index.js
│   ├── interfaces.d.ts
│   ├── media.d.ts
│   ├── recorder.d.ts
│   └── storage.d.ts
├── src
│   ├── utils
│   │   ├── camera.ts
│   │   ├── canvas.ts
│   │   └── utils.ts
│   ├── enums.ts
│   ├── index.ts
│   ├── interfaces.ts
│   ├── media.ts
│   ├── recorder.ts
│   ├── storage.ts
│   └── type.d.ts
├── webpack
│   ├── build.config.js
│   └── dev.config.js
├── .gitignore
├── .prettierignore
├── TODO.md
├── package.json
└── tsconfig.json