Files
to-live-photo/docs/PRD_LivePhoto_App_V0.2_2025-12-13.md
empty 299415a530 feat: 初始化 Live Photo 项目结构
- 添加 PRD、技术规范、交互规范文档 (V0.2)
- 创建 Swift Package 和 Xcode 项目
- 实现 LivePhotoCore 基础模块
- 添加 HEIC MakerNote 元数据写入功能
- 创建项目结构文档和任务清单
- 添加 .gitignore 忽略规则
2025-12-14 16:21:20 +08:00

20 KiB
Raw Blame History

PRDLive Photo 制作与动态壁纸引导 App

适用平台iPhone / iPadiOS / iPadOS

文档版本V0.2(草案)

日期2025-12-13Asia/Manila

作者:——(待填)

1. 文档信息与变更记录

2. 背景与机会

用户希望把自拍视频/短片制作成“像苹果实况照片Live Photo一样”的内容用于相册浏览、分享例如发微信、并在支持的系统版本上设置为锁屏动态壁纸。

痛点 1现有转换工具分散流程复杂导入、裁剪、转码、导出、再去相册设置

痛点 2很多用户不知道 iOS/iPadOS 不同版本对 Live Photo 壁纸的支持差异,导致“做出来不能动”。

痛点 3对尺寸/时长/关键帧(封面)选择缺乏指导,成品效果不稳定。

本 App 提供一站式:导入视频 → 生成系统可识别的 Live Photo → 保存到相册 → 分步骤引导设置壁纸。

3. 产品目标与非目标

3.1 目标Goals

G1用户可从“视频/照片素材”快速生成“系统相册识别的 Live Photo”并保存到相册。

G2提供清晰的“设置为锁屏动态壁纸”引导降低因系统版本/设置项导致的失败率。

G3通过模板与提示帮助用户得到高成功率的“可播放、可分享、封面好看”的作品。

G4适配 iPhone 与 iPad不同屏幕与比例下提供合理裁剪与预览。

3.2 非目标Non-goals

不使用任何私有 API 直接替用户设置系统壁纸App Store 会拒)。

不做云端素材社区/版权图库(可在后续版本作为增长模块另立项)。

不保证所有历史系统版本都能播放 Live Photo 壁纸动画(受系统能力限制)。

4. 目标用户与使用场景

4.1 目标用户Personas

P1普通用户——想把自拍视频做成动态壁纸但不懂格式/设置路径。

P2内容创作者——需要批量把短视频转 Live Photo 进行分享与展示。

P3设计/审美用户——关注裁剪、封面帧、色彩与动效节奏。

4.2 核心场景Scenarios

S1用户选择一段 2-5 秒视频,生成 Live Photo保存并设置为锁屏动态壁纸。

S2用户选择“照片 + 视频”合成(照片做封面),并指定关键帧。

S3用户生成后想发微信需要在相册里保持 Live Photo 形态并可被微信识别。

S4用户在 iPad 上制作,导出后在 iPhone 上设置壁纸(跨设备)。

5. 兼容性与约束

5.1 系统与功能可用性(建议写在 App 内)

Live Photo 生成与保存iOS/iPadOS 14+(建议 15+)可实现(依赖 Photos / AVFoundation

“Live Photo 作为锁屏动态壁纸播放”iOS 17 或更高版本支持在锁屏唤醒时播放iPhone 官方说明)。

iPadOS 锁屏支持 Live Photo 的动效选项(官方 iPad 用户指南包含 Live Photo 动效按钮说明)。

注意Live Photo 动效通常只作用于锁屏;主屏一般显示静态图(以系统版本为准)。

低电量模式等系统状态可能导致动效不可用(需在引导里提示)。

5.2 平台约束(必须写清)

iOS/iPadOS 没有公开 API 允许第三方 App 直接设置系统壁纸:只能引导用户在系统界面完成设置。

禁止使用私有 API、越狱方案或企业签名绕过不符合 App Store 上架)。

6. 需求范围MVP

6.1 MVP 功能列表

导入:从相册选择视频;可选:选择封面照片(可不选,默认从视频自动取帧)。

编辑:裁剪比例(适配 iPhone/iPad 锁屏常见比例)、裁剪时长(建议 2-3 秒)、选择封面帧(关键帧)。

生成:将素材合成为系统可识别 Live Photo照片 + pairedVideo + 元数据)。

保存保存到系统相册Live Photos 相簿 / 最近项目)。

引导:分步骤引导用户把 Live Photo 设置为锁屏动态壁纸(按系统版本展示不同路径)。

质量检测:生成后做一次本地校验(能否被系统识别为 Live Photo失败原因提示

6.2 后续版本Backlog

模板:预设“人物/风景/文字”裁剪模板、调速/慢动作适配。

批量生成:一次导入多段视频,批量导出 Live Photo。

小组件/主题包:壁纸合集管理(订阅制/一次性购买)。

分享:一键分享(注意平台对实况/视频的支持差异)。

7. 用户流程

7.1 主流程:视频 → Live Photo → 设置锁屏

进入首页,点击【从相册导入视频】。

选择视频后进入编辑页:裁剪比例、裁剪时长、选择封面帧。

点击【生成 Live Photo】显示进度与阶段文案处理视频 / 写入元数据 / 保存准备)。

生成成功 → 点击【保存到相册】;提示“已保存,可在 Live Photos 相簿查看”。

进入【设置壁纸引导】:按步骤提示用户在系统【设置 > 墙纸】选择 Live Photo 并开启 Live 动效。

7.2 失败/异常流程

用户拒绝相册权限:展示解释页,并引导去系统设置开启。

生成失败(编码/元数据写入失败):提示原因 + 建议(更换视频编码、缩短时长、降低分辨率)。

保存成功但系统未识别为 Live Photo提示“请在相册查看是否有 Live 标识”,并提供重新生成按钮。

8. 功能需求详述

8.1 首页

入口 1导入视频必选

入口 2导入照片 + 视频(可选,作为高级模式)。

入口 3教程/引导(包含系统版本差异、常见问题)。

展示最近生成的作品列表MVP 可只展示最近 10 条)。

8.2 编辑页

裁剪比例常用预设iPhone 锁屏 / 全面屏 / 4:3 等),支持手动缩放与拖拽。

时长:默认 3 秒;可选范围 1.5-5 秒(过长降低成功率与体积)。

封面帧:滑杆选择时间点;支持“智能推荐封面”(清晰、有人脸、少抖动)。

预览:静态预览 + 动效预览(模拟锁屏唤醒播放方式)。

8.3 生成引擎(核心)

输入:视频(必选) + 可选封面照片。

输出:照片文件(建议 HEIC+ 视频文件MOVH.264/HEVC+ 绑定元数据identifier、still-image-time 等)。

关键规则:照片与视频共享同一 content/asset identifier视频包含 still-image-time 标记关键帧。

对视频进行重封装re-mux以写入元数据必要时重新编码可配置优先保留编码失败则转码

导出参数建议:分辨率/比特率上限以保证速度与成功率;音频可选保留/移除。

本地校验:生成后尝试用系统方式加载校验(如 PHLivePhoto 请求加载)并输出可读错误。

8.4 保存到相册

使用 Photos 写入photo 资源 + pairedVideo 资源。

成功回调:提示“已保存”;失败回调:展示错误与建议。

相册归类:系统会自动归类到 Live PhotosApp 内保存最近作品列表。

8.5 动态壁纸设置引导

按系统版本展示不同文案与截图示意。

iOS/iPadOS 17+:引导用户进入【设置 > 墙纸 > 添加新墙纸 > 照片 > Live Photo】并开启 Live 播放选项。

iOS/iPadOS 16明确提示系统限制提供替代方案设置静态壁纸/升级系统建议)。

常见失败提示低电量模式、Motion not available、素材参数不兼容等。

提供按钮:打开系统设置(尽量深链;无法深链则打开设置首页)。

9. 非功能需求

9.1 性能与体验

生成过程需有可见进度与阶段提示;失败可重试。

中间文件自动清理;不占用过多存储。

错误提示要“可行动”:给出下一步(缩短时长、降低分辨率、重新选择素材)。

9.2 隐私与合规

默认本地处理:不上传用户照片/视频。

权限最小化:仅在需要时请求相册/相机/麦克风权限,并提供用途说明。

如接入统计:匿名化、可关闭,并在隐私政策中说明。

10. 数据埋点与指标

10.1 核心漏斗

导入视频 → 进入编辑 → 点击生成 → 生成成功 → 保存成功 → 进入壁纸引导 → 引导完成(点击“完成/已设置”)。

10.2 关键指标KPIs

生成成功率(按机型/系统版本/视频参数分层)。

保存成功率(相册写入成功)。

引导完成率(壁纸设置引导)。

7 日留存(如后续商业化,再加转化率)。

11. 里程碑建议

M0技术预研Live Photo 合成可行性、系统版本验证、参数边界)。

M1MVP导入视频 → 生成 → 保存 → 基础引导)。

M2适配 iPad + 编辑体验提升(比例模板、预览增强)。

M3稳定性与质量失败提示、自动降级转码、素材建议

12. 验收标准MVP

在 iPhone至少 2 款机型)与 iPad至少 1 款机型)上:从相册导入视频可生成 Live Photo 并保存到系统相册。

生成的 Live Photo 在系统相册中显示为 Live Photo有 Live 标识,长按可播放)。

在支持 Live Photo 锁屏播放的系统版本上,用户可按引导步骤完成设置并在唤醒锁屏时播放。

在不支持版本上App 必须明确提示限制并给出替代方案,避免误导。

不使用私有 API权限声明齐全可通过 App Store 审核。

13. 风险与对策

R1系统版本差异 → 版本检测 + 差异化引导文案。

R2素材多样导致失败 → 参数归一化 + 自动降级转码 + 可读错误提示。

R3用户期待“主屏也会动” → 产品内明确说明:通常仅锁屏动效。

R4审核风险 → 只做引导,不做自动设置;不接触私有 API。

14. 参考资料TBD

Apple SupportSet a Live Photo as your Lock Screen wallpaper (iOS 17+): https://support.apple.com/120734

Apple SupportChange your iPhone wallpaper含 Live Photo 入口说明): https://support.apple.com/102638

Apple iPad User GuideCreate a custom iPad Lock Screen: https://support.apple.com/guide/ipad/ipad782d4de8/ipados

Apple iPad User GuideChange the wallpaper on iPad: https://support.apple.com/guide/ipad/ipad997d908e/ipados

15. 信息架构与页面清单

本节用于指导你用 AI 编码时的页面/路由/组件拆分。

15.1 信息架构IA

首页Home导入视频 / 高级合成 / 教程与FAQ / 最近作品列表

编辑页Editor比例裁剪、时长裁剪、封面帧选择、预览、生成按钮

生成进度页Processing阶段进度、取消/后台、失败原因与重试

结果页Result保存到相册、再次编辑、进入壁纸引导、分享后续

壁纸引导页Wallpaper Guide按系统版本展示步骤、常见问题、跳转设置

作品库Library - MVP可选最近作品、再次导出、删除缓存

设置Settings权限状态、清理缓存、隐私、关于、反馈

15.2 页面与路由(建议命名)

16. 用户故事与验收标准(更细颗粒)

16.1 用户故事User Stories

16.2 验收标准(按故事拆分)

US-01生成后在系统相册中显示 Live 标识;长按可播放;不出现仅照片或仅视频的孤儿资源。

US-02裁剪后的导出在锁屏预览时主体居中用户可通过手势调整导出不拉伸。

US-03用户选定封面帧后相册静态显示与导出封面一致允许系统做轻微处理

US-05引导页能根据系统版本显示正确路径并提示低电量模式/系统限制’等常见原因。

US-06错误提示包含错误标题 + 可能原因 + 可点击的解决建议(例如缩短时长/降低分辨率/改用H.264)。

17. 详细功能需求表(可直接喂给 AI 编码)

17.1 功能点-输入-处理-输出

17.2 关键约束与参数建议

推荐时长2-3秒越长越大且更容易失败

推荐分辨率上限:以锁屏显示为目标,通常不需要超过 1440p可按设备上限做自适应。

帧率:建议 30fps高帧率素材可降到30fps以提升兼容性。

编码:优先保留原编码;失败时降级到 H.264 + AAC更通用

HDR/Dolby Vision可提示用户可能存在兼容性问题必要时转 SDR。

18. 技术方案概述(研发实现导向)

18.1 模块划分

18.2 Live Photo 合成关键点(落地检查清单)

生成 assetIdentifierUUID字符串

图片侧:写入 Apple MakerNote/相关标识建议HEIC

视频侧:写入 QuickTime content identifier 元数据 + still-image-time timed metadata track。

保存侧PHAssetCreationRequest 同时写入 .photo 与 .pairedVideo。

校验侧:尝试从相册 asset 请求 PHLivePhoto 或检查 Live 标识是否出现。

18.3 权限与Info.plist

NSPhotoLibraryUsageDescription读取相册用于选择素材

NSPhotoLibraryAddUsageDescription保存生成的 Live Photo 到相册

NSCameraUsageDescription如后续加入拍摄入口

NSMicrophoneUsageDescription如保留或录制音频

19. 数据模型与本地存储

19.1 本地作品模型(示例)

WorkItemid、createTime、sourceVideoLocalID、exportParamsratio/trim/keyFrame、resultAssetLocalID相册asset.localIdentifier、statusprocessing/success/failed、errorCode、thumbnailPath。

缓存目录:/Library/Caches/LivePhotoBuilder/{workId}/中间mov、heic、日志

清理策略:成功后保留缩略图与参数;中间文件按设置或定期清理。

20. QA 测试计划MVP

20.1 测试矩阵

20.2 用例清单(样例)

从相册导入竖屏30fps H.264视频默认参数生成并保存确认相册显示Live标识且可播放。

导入60fps HEVC视频选择3秒裁剪生成成功若失败需自动降级转码并提示。

导入HDR视频提示可能兼容性风险选择转SDR后生成成功。

拒绝相册权限后再次进入导入流程,能看到解释页并可跳转系统设置。

在iOS 16设备壁纸引导页必须显示“系统限制/不支持动效”的文案与替代方案。

21. 合规、审核与版权

壁纸设置:不得宣称“一键自动设置系统壁纸”,应明确为“引导用户在系统中设置”。

权限说明:文案必须与实际用途一致,避免过度索权。

版权与内容:用户素材本地处理;若引入模板/素材库需提供版权声明与授权来源。

隐私政策:说明是否收集设备信息、崩溃日志与使用数据;提供关闭选项。

22. 文案与引导内容可直接放App里

22.1 关键页面文案(示例)

22.2 壁纸设置步骤卡片iOS 17+ 示例)

打开【设置】->【墙纸】。

点击【添加新墙纸】->【照片】。

选择你刚保存的 Live Photo带 Live 标识)。

点击屏幕左下角的【Live】按钮确保动效开启若可见

保存并设置到锁屏。唤醒锁屏时,按压/触摸或系统动作会触发动效(以系统表现为准)。

提示:提示:若出现 “Motion not available”请检查是否开启低电量模式、是否选择了 Live Photo、素材是否过长/过大。

23. 开放问题需你决策后再让AI编码

商业化:免费+广告?一次性买断?订阅(模板/批量/高清导出)?

支持的最低系统版本iOS 14/15/16决定了API与用户覆盖

是否支持拍摄直接生成AVCapture Live Photo Capture作为后续版本

是否需要“跨设备同步”iCloud保存作品参数/模板?

是否需要“微信分享优化”检测相册资产是否仍为Live Photo形态

附录:表格汇总

表格 1

| 版本 | 日期 | 作者 | 说明 |

| --- | --- | --- | --- |

| V0.1 | 2025-12-13 | —— | 首版草案:功能范围、流程与需求拆解 |

| V0.2 | 2025-12-13 | —— | 补充信息架构、用户故事、详细需求表、技术方案、QA/合规与开放问题 |

| V1.0 | —— | —— | (预留) |

表格 2

| 页面 | 路由/模块名 | 主要能力 | MVP |

| --- | --- | --- | --- |

| 首页 | HomeView | 导入入口、最近作品 | 是 |

| 编辑 | EditorView | 裁剪/封面/预览/生成 | 是 |

| 生成进度 | ProcessingView | 进度、取消、失败重试 | 是 |

| 结果 | ResultView | 保存、再次编辑、引导入口 | 是 |

| 壁纸引导 | WallpaperGuideView | 版本检测、步骤卡片、FAQ | 是 |

| 作品库 | LibraryView | 作品管理 | 可选 |

| 设置 | SettingsView | 权限、清理、隐私、反馈 | 可选 |

表格 3

| 编号 | 用户故事 | 优先级 | 备注 |

| --- | --- | --- | --- |

| US-01 | 作为用户,我想从相册选择一段视频并生成 Live Photo这样我可以在相册长按播放。 | P0 | 核心闭环 |

| US-02 | 作为用户,我想裁剪比例以适配锁屏,避免设置壁纸后被系统裁掉关键主体。 | P0 | 需预设模板 |

| US-03 | 作为用户,我想选择封面帧(关键帧),这样锁屏静止画面最好看。 | P0 | 提供智能推荐 |

| US-04 | 作为用户,我想保存到相册并看到 Live 标识,确保微信等平台可识别为实况。 | P0 | 写入 pairedVideo |

| US-05 | 作为用户,我想得到清晰的设置壁纸引导,减少我找不到入口或不能动的困扰。 | P0 | 版本差异化 |

| US-06 | 作为用户,我希望失败时能看到原因和解决办法,而不是一句“失败”。 | P0 | 错误可行动 |

| US-07 | 作为高级用户,我想用‘照片+视频’合成,以照片为封面,视频为动效。 | P1 | 高级模式 |

| US-08 | 作为用户,我想一键清理缓存,避免占用太多存储。 | P1 | 设置页 |

表格 4

| 功能点 | 输入 | 处理/规则 | 输出/状态 | 优先级 |

| --- | --- | --- | --- | --- |

| 导入视频 | PHPicker选择视频 | 读取时长/分辨率/帧率/编码;提示不推荐参数 | 进入编辑页或提示不兼容 | P0 |

| 比例裁剪 | 视频画面 + 模板比例 | 支持拖拽/缩放;保持比例;实时预览 | 裁剪区域参数scale/offset | P0 |

| 时长裁剪 | 起止时间 | 默认3秒限制1.5-5秒对齐关键帧建议 | trimStart/trimEnd | P0 |

| 封面帧选择 | 时间点t | 提供静帧预览可智能推荐t* | keyFrameTime | P0 |

| 生成Live Photo | 视频+裁剪+关键帧(+可选封面照) | 重封装写入content identifier、still-image-time必要时转码 | photoURL + videoURL + 成功/失败 | P0 |

| 保存到相册 | photoURL+videoURL | PHAssetCreationRequest写入.photo与.pairedVideo | 相册新增Live Photo资产 | P0 |

| 引导设置壁纸 | 系统版本/设备类型 | 差异化步骤卡片提示限制与FAQ | 用户完成率提升 | P0 |

| 缓存清理 | 中间文件目录 | 仅清理App生成缓存不影响相册成品 | 释放存储空间 | P1 |

表格 5

| 模块 | 职责 | 关键框架/组件 |

| --- | --- | --- |

| MediaImport | PHPicker选择媒体、读取元信息 | PhotosUI, AVFoundation |

| EditorCore | 裁剪参数管理、预览渲染 | SwiftUI/UIView, AVPlayer |

| LivePhotoBuilder | 写入元数据、重封装/转码 | AVAssetReader/Writer, ImageIO |

| AlbumWriter | 写入系统相册 | Photos |

| Validation | 生成后校验是否为Live Photo | Photos, PHLivePhoto |

| GuideEngine | 版本检测、引导内容与FAQ | UIKit/SwiftUI |

| CacheManager | 中间文件管理与清理 | FileManager |

| Analytics | 埋点与漏斗 | 自研/第三方SDK |

表格 6

| 维度 | 覆盖建议 |

| --- | --- |

| 设备 | 至少2款iPhone不同分辨率+ 1款iPad |

| 系统 | iOS/iPadOS 17+(验证壁纸动效)+ iOS/iPadOS 16验证限制提示 |

| 素材 | H.264/HEVC30/60fpsSDR/HDR有/无音频;竖/横屏 |

| 时长 | 1.5秒、3秒、5秒边界 |

| 权限 | 首次拒绝/后续开启;相册只读/读写 |

表格 7

| 场景 | 标题 | 正文/提示 | 按钮 |

| --- | --- | --- | --- |

| 生成中 | 正在生成 Live Photo | 正在处理视频并写入实况信息,请不要退出。 | 取消 / 后台继续 |

| 生成成功 | 生成成功 | 已生成实况照片。保存到相册后可在“照片”里长按播放。 | 保存到相册 / 去设置壁纸 |

| 保存成功 | 已保存到相册 | 你可以在“Live Photos”相簿找到它。 | 去设置壁纸 / 再做一个 |

| 不支持提示 | 当前系统限制 | 此系统版本无法将 Live Photo 作为可播放的锁屏壁纸。你仍可保存为实况照片,或升级系统后再设置。 | 了解原因 / 返回 |

| 低电量提示 | 可能无法播放动效 | 低电量模式可能导致锁屏动效不可用。 | 知道了 |