如何把 MP3 转为 Base64
- 把
.mp3文件拖到框中,或用文件选择器选择。 - 在预览中试听,确认是正确的片段。
- 用于 HTML 和 JavaScript 时,输出为 保持为 Data URI;用于 API 时切换为 纯 Base64 或 JSON。
- 按 复制输出;文件较长时可以按 另存为 .txt。
各码率对应的长度
MP3 的大小等于码率乘以时长,Base64 再让它长三分之一。下面的数字只计算音频数据,不含标签:
| 码率 | 1 秒 | 10 秒 | 1 分钟 |
|---|---|---|---|
| 64 kbps | 10,668 个字符 | 106,668 个字符 | 640,000 个字符 |
| 128 kbps | 21,336 个字符 | 213,336 个字符 | 1,280,000 个字符 |
| 192 kbps | 32,000 个字符 | 320,000 个字符 | 1,920,000 个字符 |
| 320 kbps | 53,336 个字符 | 533,336 个字符 | 3,200,000 个字符 |
对于提示音或语音提示,64 kbps 单声道通常绰绰有余,字符串也短。如果片段比需要的长,编码前先在音频编辑器中以更低的码率重新导出。
ID3 标签可能占了文件的大头
来自音乐库的 MP3 文件开头带有 ID3v2 标签,其中经常嵌有封面图。一个两秒的音效,附带的封面图可能比音频本身还大,而这些全都会进入 Base64。
带标签的文件,输出以 SUQz 开头。SUQzBA 表示 ID3 2.4 版,SUQzAw 表示 2.3 版。如果文件用于界面音效或 API,请先用音频编辑器或标签编辑器删除标签,再编码干净的文件。输出下方的指示条会显示两者的差别。
使用 Base64 MP3
在 HTML 中:
<audio controls src="data:audio/mpeg;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2..."></audio>
在 JavaScript 中,data URI 可以用在任何接受 URL 的地方:
const ping = new Audio("data:audio/mpeg;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2...");
document.querySelector("#send").addEventListener("click", () => ping.play());
play() 必须在点击等用户操作之后运行,否则浏览器会阻止它。
对于 JSON API,除非文档注明使用 data URI,否则请用 纯 Base64。尤其是语音转文字服务,通常需要纯 Base64,再加一个单独的字段说明音频格式。
常见问题
- 播放器没有声音。 检查 data URI 是否以
data:audio/mpeg;base64,开头,并确认 URL 安全(- _) 和 每 76 字符换行 都已关闭。URL 安全字符在data:URL 中无效,换行则会截断 JavaScript 字符串字面量。 - 时长不对或拖动进度时跳跃。 没有正确头部信息的可变码率 MP3 会让播放器出错。这个问题来自文件本身;请用音频编辑器重新导出。
- 需要把文件还原回来。 Base64 转 MP3 可以解码字符串,并播放或下载。其他格式见 音频转 Base64。
常见问题
Base64 MP3 的正确 MIME 类型是什么?
audio/mpeg。有些代码里能看到 audio/mp3,但注册的类型是 audio/mpeg,会校验类型的 API 也要求它。
为什么 MP3 的 Base64 以 SUQz 开头?
SUQz 就是 ID3,即 ID3v2 标签的开头,其中有标题、艺术家,可能还有封面图。不带标签的 MP3 文件直接以音频帧开头,编码后是 // 加一个字母,例如 //uQ 或 //OQ。
一分钟的 MP3 转成 Base64 有多少个字符?
128 kbps 时,一分钟音频是 960,000 字节,编码后是 1,280,000 个字符。64 kbps 时减半。标签和封面另算。