Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 

Repository files navigation

make_motion_photo.py — Google Motion Photo 生成工具

将一段视频和一张封面照片合成为一个 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 中可用)

安装 ffmpeg

# 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 格式的核心思想是文件拼接。本工具生成的正是此格式:

  1. 文件开头是一个标准 JPEG 图片(包含 EXIF/XMP 元数据),普通看图软件读到 JPEG 结束标记后停止,将其视为普通照片
  2. 文件的剩余部分是完整的 MP4 视频(含音轨),直接拼接在 JPEG 数据之后
  3. 嵌入在 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 格式。

与 Apple Live Photos 的对比

特性 Google Motion Photo(本工具) Apple Live Photos
容器结构 JPEG + MP4 拼接 HEIC + MOV 拼接
封面图 JPEG HEIC
视频编码 H.264 + AAC H.264 / HEVC + AAC
标准制定方 Google Apple
兼容性 Android / Web Apple 生态

常见问题

Q: 封面照片和视频画面颜色为什么略有差异?

封面 JPEG 和视频的 H.264 使用不同的色彩空间(JPEG 为 full range yuvj420p,视频为 TV range yuv420p),这是正常现象,不影响功能。

Q: 输入视频的编码格式有要求吗?

无要求。ffmpeg 会自动将视频重编码为 H.264、音频重编码为 AAC,以确保兼容性。

Q: 这个脚本是不是理论上可以转换任意长度的视频到实况照片?

是,技术上不限长度。但实况照片的设计初衷是捕捉"瞬间",建议使用 3~10 秒的片段。超过 20 秒文件会很大,且失去"动态照片"的轻量感。如需分享长视频,建议直接使用 MP4 格式。


许可

MIT

About

将任意长度的视频转换成 motion photo / 动态图片 / 实况照片的脚本。

Topics

Resources

Stars

16 stars

Watchers

0 watching

Forks

Contributors

Languages