将一段视频和一张封面照片合成为一个 Google Motion Photo(实况照片/动态照片)文件。生成的 .MP.JPG 文件兼容 Google Photos、iOS 相册、小红书等主流平台。
源文件结构:
┌──────────────────────────────────────┐
│ JPEG 静态封面图 │
│ ├─ SOI (FF D8) │
│ ├─ APP1 / XMP (MotionPhoto 元数据) │
│ ├─ 图像数据 │
│ └─ EOI (FF D9) │
├──────────────────────────────────────┤
│ MP4 视频 (含音频) │
│ ├─ ftyp │
│ ├─ moov │
│ └─ mdat (H.264 + AAC) │
└──────────────────────────────────────┘
支持 Motion Photo 的相册/平台通过 XMP 元数据识别该文件,提取尾部 MP4 进行播放。
- Python 3.6+
- ffmpeg + ffprobe(须在
PATH中可用)
# macOS
brew install ffmpeg
# Ubuntu / Debian
sudo apt install ffmpeg
# Windows (chocolatey)
choco install ffmpeg
# Windows (scoop)
scoop install ffmpeg验证安装:
ffmpeg -version
ffprobe -version# 最基本的用法:视频转 Motion Photo(自动从第 1 秒抽帧作为封面)
python3 make_motion_photo.py input_video.mp4 -o output.MP.JPG
# 指定封面照片
python3 make_motion_photo.py input_video.mp4 -c cover.jpg -o output.MP.JPG
# 指定画质和分辨率
python3 make_motion_photo.py input_video.mp4 -q compact -r 1080p -o output.MP.JPG| 参数 | 说明 | 默认值 |
|---|---|---|
video |
输入视频文件(位置参数,必填) | — |
-o, --output |
输出文件路径 | output.MP.JPG |
-c, --cover |
静态封面照片(JPEG) | 从视频第 1 秒自动抽帧 |
-q, --quality |
编码质量预设 | balanced |
-r, --resize |
输出视频高度(仅降采样,不升采样) | 保持原始分辨率 |
--presentation-ts |
封面帧在视频中的时间戳(微秒) | 1000000(即第 1 秒) |
| 预置 | 视频 CRF | 音频码率 | 编码预设 | 适用场景 |
|---|---|---|---|---|
compact |
28 | 96k AAC | medium | 文件体积优先,可接受画质 |
balanced |
23 | 128k AAC | medium | 画质与体积平衡(默认) |
pristine |
18 | 256k AAC | slow | 画质优先,文件最大 |
| 值 | 输出高度(像素) |
|---|---|
480p |
480 |
720p |
720 |
1080p |
1080 |
1440p |
1440 |
2160p |
2160 |
注意:脚本会自动检测输入视频的最短边(例如 3840×2160 为 2160p,1920×1080 为 1080p)。如果指定的 -r 值高于源视频的最短边,脚本会报错退出,不会进行升采样。
# 最小体积:compact + 720p
python3 make_motion_photo.py 4k_video.mp4 -q compact -r 720p -o live_photo.MP.JPG
# 最佳画质 + 自定义封面
python3 make_motion_photo.py video.mp4 -c my_photo.jpg -q pristine -o output.MP.JPG
# 保留原始 4K 分辨率 + 默认画质
python3 make_motion_photo.py video.mp4 -o output.MP.JPG以 4K 视频(约 3 秒)为例,各质量预设的典型输出大小:
| 质量 | 分辨率 | JPEG 部分 | MP4 部分 | 总计 |
|---|---|---|---|---|
| compact | 1080p | ~225 KB | ~90 KB | ~315 KB |
| balanced | 原始 4K | ~1 MB | ~6 MB | ~7 MB |
| pristine | 原始 4K | ~1 MB | ~15 MB | ~16 MB |
实际大小取决于视频时长、画面复杂度和原始分辨率。
Google Motion Photo 格式的核心思想是文件拼接。本工具生成的正是此格式:
- 文件开头是一个标准 JPEG 图片(包含 EXIF/XMP 元数据),普通看图软件读到 JPEG 结束标记后停止,将其视为普通照片
- 文件的剩余部分是完整的 MP4 视频(含音轨),直接拼接在 JPEG 数据之后
- 嵌入在 JPEG APP1 段的 XMP 元数据(
Camera:MotionPhoto="1"+Container:Directory)告诉支持的应用:文件尾部有一段嵌入式视频
MOV 和 MP4 底层基于同一容器规范(ISO Base Media File Format),仅在文件标识和部分元数据上有差异。Google 选择了 MP4 作为 Motion Photo 的视频容器,Apple 选择了 MOV 用于 Live Photos,两者在功能上等价。本工具生成 Google Motion Photo 格式。
| 特性 | Google Motion Photo(本工具) | Apple Live Photos |
|---|---|---|
| 容器结构 | JPEG + MP4 拼接 | HEIC + MOV 拼接 |
| 封面图 | JPEG | HEIC |
| 视频编码 | H.264 + AAC | H.264 / HEVC + AAC |
| 标准制定方 | Apple | |
| 兼容性 | Android / Web | Apple 生态 |
封面 JPEG 和视频的 H.264 使用不同的色彩空间(JPEG 为 full range yuvj420p,视频为 TV range yuv420p),这是正常现象,不影响功能。
无要求。ffmpeg 会自动将视频重编码为 H.264、音频重编码为 AAC,以确保兼容性。
是,技术上不限长度。但实况照片的设计初衷是捕捉"瞬间",建议使用 3~10 秒的片段。超过 20 秒文件会很大,且失去"动态照片"的轻量感。如需分享长视频,建议直接使用 MP4 格式。
MIT