mediarecorder构造时传mimetype是唯一控制编码格式的方式,必须在初始化时确定且不可修改;漏写或错误将导致fallback或初始化失败。

MediaRecorder 构造时传 mimeType 是唯一控制编码格式的方式
浏览器不会让你在录制过程中动态切换编码器,mimeType 必须在 new MediaRecorder(stream, { mimeType }) 时就确定,且后续无法修改。它不是“建议格式”,而是直接告诉浏览器:用这个容器+编解码器组合来打包每一帧。漏掉或写错,轻则 fallback 到默认(如 Chrome 自选 video/webm;codecs=vp8),重则初始化失败抛 TypeError: Failed to construct 'MediaRecorder'。
MediaRecorder.isTypeSupported() 不是可有可无的校验步骤
不同浏览器对同一 mimeType 的支持程度差异极大,硬写 video/mp4 在 Safari 16.3 及更早版本会直接报错,Firefox 则压根不认这个字符串。必须在构造前检查:
-
MediaRecorder.isTypeSupported('video/webm')—— 全平台最稳,必通 -
MediaRecorder.isTypeSupported('video/webm;codecs=vp9')—— Chrome/Edge 支持好,Firefox 90+ 才稳定,Safari 不支持 -
MediaRecorder.isTypeSupported('video/mp4')—— Safari 16.4+/macOS 13.3+ 仅支持无codecs参数的裸video/mp4;加了;codecs=avc1.4d002a就会返回false -
MediaRecorder.isTypeSupported('video/webm;codecs=av1')—— Chrome 需开启 flag,Firefox 90+,Safari 17.0+ 才行
写 codecs 参数时,浏览器对语法敏感得离谱
哪怕多一个空格、少一个引号、大小写错位,都可能导致 isTypeSupported() 返回 false 或初始化静默失败。常见翻车点:
- Safari 要求
video/mp4必须不带codecs,写成'video/mp4; codecs="avc1.4d002a"'就挂 - Chrome 认
video/webm;codecs=vp9,但不认video/webm; codecs = vp9(等号前后有空格) - Firefox 对
av1的 profile 写法很挑剔,av01.0.04M.08可能被拒,而av01.0.05M.08才行(取决于硬件解码能力) - 不要试图混用音视频 codec,比如
video/webm;codecs="vp8,opus"—— 浏览器不解析这种写法,应只写视频 codec
实际项目中推荐的 mimeType 写法
别追求“最新最猛”,优先保录制成功和播放兼容。按场景选:
- 通用 Web 场景(含微信、PPT 插入):
'video/webm'—— 不写 codecs,靠浏览器自动选 vp8,99% 设备能播 - 需更高画质且可控(Chrome/Edge 主力):
MediaRecorder.isTypeSupported('video/webm;codecs=vp9') ? 'video/webm;codecs=vp9' : 'video/webm' - 明确要 MP4 且只跑 Safari 16.4+ 或 macOS 13.3+:
MediaRecorder.isTypeSupported('video/mp4') ? 'video/mp4' : 'video/webm',且绝对不要加 codecs - Canvas 录制动画:
'video/webm'最稳妥;真要 MP4,录完用ffmpeg.wasm转,别指望 MediaRecorder 原生输出 H.264+AAC
真正容易被忽略的是:即使 isTypeSupported() 返回 true,也不代表最终生成的 Blob 一定能被所有播放器解码——比如某些 Android WebView 对 vp9 支持不全,所以交付前务必在目标环境实测播放。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











