MediaRecorder 不直接编码转换,仅按 mimeType 录制;应动态检测支持格式:优先 audio/webm; codecs=opus,次选 audio/webm 或 audio/wav,Safari 可试 audio/mp4;MP3 需录制后用 ffmpeg.wasm 转码。

MediaRecorder 本身不直接做“编码转换”,它只负责按指定 mimeType 录制媒体流,输出格式取决于浏览器支持能力。所谓“录音格式转换”,实际是通过选择不同 mimeType 启动录制,或在录制后借助转码库(如 ffmpeg.wasm)完成格式变更。
浏览器原生支持的音频格式
不同浏览器对 MediaRecorder 的 mimeType 支持差异明显,不能硬编码 MP3 或 AAC:
-
Chrome / Edge / Firefox:稳定支持
audio/webm; codecs=opus(推荐),也支持audio/wav(无压缩,体积大但兼容性好) -
Safari(iOS 16.4+ / macOS 13.3+):仅支持
audio/mp4,且需注意其底层使用 AAC 编码,但部分旧版本可能静默失败 -
不支持的写法:
audio/mp3、audio/mpeg在所有主流浏览器中均不被MediaRecorder.isTypeSupported()认可
如何安全选择录制格式
避免因 mimeType 不支持导致录制失败,应动态检测并降级:
把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。
- 先调用
MediaRecorder.isTypeSupported('audio/webm; codecs=opus'),为真则使用 Opus/WebM - 若不支持,尝试
'audio/webm'(默认编码,通常为 Opus) - 再退至
'audio/wav',虽体积大但 100% 可用 - 对 Safari 用户,可单独判断
isTypeSupported('audio/mp4'),启用时需确保设备系统版本达标
录制后转 MP3 的可行路径
若业务必须交付 MP3 文件,不能依赖 MediaRecorder 直出,需额外处理:
-
前端转码:用
ffmpeg.wasm加载 WebM/WAV Blob,执行命令如-i input.webm -c:a libmp3lame -q:a 4 output.mp3,适合小文件( - 后端转码:上传 WebM 到服务端,用 FFmpeg 命令行或云转码 API(如 AWS MediaConvert)生成 MP3,更稳定、可控,适合长录音或批量处理
- 规避方案:直接提供 WebM 下载,现代播放器(包括微信、钉钉、Windows 系统自带播放器)基本都支持,无需强求 MP3
常见陷阱与建议
很多项目卡在“为什么录出来不是 MP3”,本质是混淆了录制与编码职责:
- 不要给 MediaRecorder 传
mimeType: 'audio/mp3'——它会静默忽略或抛错 - 不要在
dataavailable中逐块转码——WebM 分片不是完整音频帧,无法独立解码 - WAV 录制虽简单,但 1 分钟录音约 10MB,移动端易触发内存警告,建议限制时长或提示用户
- 停止录制后务必调用
stream.getTracks().forEach(t => t.stop()),否则麦克风持续占用,影响其他应用
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










