MediaRecorder 的 mimeType 参数决定容器格式与编码器,是初始化时锁定编码行为的核心选项,必须用 MediaRecorder.isTypeSupported() 检测后方可使用,不可硬写;常用组合包括 video/webm; codecs="vp8/vp9" 和 video/mp4; codecs="avc1.64001f",但浏览器支持差异大,需按优先级降级尝试。

MediaRecorder 的 mimeType 参数直接决定视频录制的容器格式和内部编码器,是控制输出质量、体积与兼容性的关键。它不是“可选配置”,而是初始化时就锁定编码行为的核心选项。
支持的 mimeType 格式及对应编码
浏览器对 mimeType 的支持差异明显,不能随意填写。常用且较稳妥的组合如下:
- video/webm; codecs="vp8":全平台稳定支持(Chrome/Firefox/Edge),压缩率中等,适合通用场景
- video/webm; codecs="vp9":比 VP8 更高压缩比,画质相近下体积小 20%–30%,但编码耗 CPU,Firefox 和 Chrome 支持好,Safari 不支持
-
video/webm; codecs="opus":这是音频 mimeType,仅用于纯音频录制(
{audio: true}) - video/mp4; codecs="avc1.64001f":即 H.264 编码的 MP4,Chromium 111+ / Edge 113+ 支持,但 Firefox 完全不识别,Safari 要求 iOS 16.4+/macOS 13.3+ 且需额外权限配置
如何安全设置并验证 mimeType
硬写一个 mimeType 可能导致 MediaRecorder 初始化失败(抛出 TypeError)。必须先检测再使用:
- 用
MediaRecorder.isTypeSupported(mimeType)判断是否可用,返回true才能传入构造函数 - 推荐按优先级尝试多个格式,例如先试 vp9,不行退到 vp8,最后 fallback 到无 codecs 的
"video/webm" - 示例逻辑:不要直接 new MediaRecorder(stream, {mimeType: "video/mp4"}),而应:
const candidates = [ "video/webm; codecs=vp9", "video/webm; codecs=vp8", "video/webm"];const mimeType = candidates.find(MediaRecorder.isTypeSupported) || "video/webm";const mediaRecorder = new MediaRecorder(stream, { mimeType });
编码参数无法通过 mimeType 精细调节
mimeType 只指定编解码器种类,不控制码率、分辨率或 GOP 大小。如需调整质量,应使用构造时的 options 配置项:
立即学习“前端免费学习笔记(深入)”;
-
videoBitsPerSecond:设置目标视频码率(如2500000表示 2.5 Mbps) -
audioBitsPerSecond:设置音频码率(如128000) - 这些值会影响最终文件大小和清晰度,但实际效果仍受浏览器底层 encoder 实现限制
特别注意 Safari 和移动端的现实约束
Safari(尤其旧版)对 captureStream() + MediaRecorder 组合支持极弱,即使 mimeType 正确,也可能因流未就绪而报 Failed to allocate videosink。iOS 16.4+ 才开始支持 video/mp4,且必须配合 getDisplayMedia 或特定摄像头配置。若目标用户含大量 iPhone 用户,建议默认用 video/webm 并接受其兼容性——WebM 在 Safari 中可正常播放,只是不能直接用 MediaRecorder 录制为 MP4。



















