如何把 MP4 转为 Base64
- 把
.mp4文件拖到框中,或用文件选择器选择。 - 在预览中播放。如果这里播放不了,在这个浏览器中通过 data URI 多半也播放不了。
- 用于
<video>标签时,输出为 保持为 Data URI;用于 API 时选择 纯 Base64 或 JSON。 - 按 复制输出;文件很大时可以按 另存为 .txt。
各码率下编码后的长度
MP4 的大小大致等于码率 × 时长。以 10 秒的片段为例:
| 总码率 | 文件大小 | Base64 长度 |
|---|---|---|
| 0.5 Mbps | 625,000 字节 | 833,336 个字符 |
| 1 Mbps | 1,250,000 字节 | 1,666,668 个字符 |
| 2.5 Mbps | 3,125,000 字节 | 4,166,668 个字符 |
| 5 Mbps | 6,250,000 字节 | 8,333,336 个字符 |
手机录像的码率常常在 10 Mbps 以上,所以 10 秒未经处理的手机视频就会超过 1600 万个字符。请先以更低的分辨率和码率重新编码;视频转 Base64 提供了一条经过测试的 ffmpeg 命令。
开头几个字符中的 ftyp brand
MP4 的第一个 box 声明了主 brand,告诉播放器文件遵循哪种规范。它在 Base64 中清晰可见:
| Brand | 含义 | Base64(ftyp box 为 32 字节时) |
|---|---|---|
isom | ISO 基础媒体文件,通用 brand(ffmpeg 的默认值) | AAAAIGZ0eXBpc29t |
mp42 | MP4 第 2 版 | AAAAIGZ0eXBtcDQy |
M4V | Apple 的 MP4 视频变体 | AAAAIGZ0eXBNNFYg |
qt | QuickTime 影片(.mov) | AAAAIGZ0eXBxdCAg |
第五个字符随 box 大小变化(24 字节为 G,28 字节为 H,32 字节为 I),所以检测代码应在前五个字符之后查找 GZ0eXB。brand 为 qt 的文件其实是取了 .mp4 名字的 QuickTime 影片;它也许仍能播放,但如果接收方会检查类型,请标记为 video/quicktime。
嵌入与发送
在自包含的 HTML 页面中嵌入一段静音的短循环视频:
<video autoplay muted loop playsinline src="data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21p..."></video>
在 Node.js 中通过 JSON 请求发送一个片段:
import { readFile } from "node:fs/promises";
const video = await readFile("clip.mp4");
const body = JSON.stringify({
mimeType: "video/mp4",
data: video.toString("base64"),
});
这里的字段名只是占位符,请使用 API 文档中规定的名称。更多内容见 Node.js 中的 Base64。
可能遇到的问题
- data URI 在 Safari 中能播放,在 Chrome 或 Firefox 中不能。 视频轨道多半是 HEVC。请重新编码为 H.264。
- 页面加载时卡住。 浏览器正在解析一个巨大的字符串。超过几 MB 的 data URI 最好换成文件 URL 或 Blob URL。
- 接收方说文件已损坏。 把解码后的长度与指示条中的原始文件大小对比;字符串被截断会切掉文件末尾,而很多 MP4 的索引就放在末尾。Base64 转 MP4 可以显示解码后的片段能否播放。
常见问题
为什么 MP4 的 Base64 以 AAAA 开头?
MP4 以第一个 box(ftyp)的大小开头,这是一个 4 字节的数字。对于任何正常的头部,前三个字节都是零,而零字节编码为 A。后面跟着 ftyp box 名称和 brand,例如 brand 为 isom 时是 AAAAIGZ0eXBpc29t。
我的 MP4 能在所有浏览器中通过 data URI 播放吗?
如果使用 H.264 视频和 AAC 音频,可以。使用 HEVC(H.265)的 MP4 文件能在 Safari 中播放,在其他浏览器中则要看系统,只有部分能播放。仅凭容器格式并不能保证可以播放。
怎样以 Base64 把 MP4 发送给 API?
除非 API 文档注明使用 data URI,否则请选 纯 Base64,并把媒体类型设为 video/mp4。对照 API 的大小限制检查编码后的长度,它比文件大三分之一。