simreel 是做什么的?
在 iOS 模拟器中录制用户的真实应用,并将其裁剪为两个文件:
reel-1080x1920.mp4:手机机身内的录制内容,置于渐变背景上,每个场景配一条字幕,末尾有结束卡片。适用于 X、Reels、TikTok、Product Hunt。appstore-preview-886x1920.mp4:纯录制内容,按 App Store Connect 要求调整尺寸和编码。
一切在本地运行,仅需 Xcode 和 ffmpeg。无需账户,无需付费 API。
规则
- 只展示应用的实际情况。字幕描述屏幕上的内容;切勿添加虚假声明、数字或评论。
- 保持框架内不含私人数据。使用全新模拟器或演示数据,交付前检查每一帧。
- 只操作指定的模拟器。其他已启动的模拟器可能属于别人的工作;如果有多个模拟器正在运行,切勿使用
booted。 - 录制时拒绝跟踪和 Cookie 弹窗,除非用户另有要求。
步骤
- 查找模拟器。
xcrun simctl list devices booted。如果应用未安装,使用用户自己的工具构建并安装。 - 先不录制走一遍应用。 选择 3 到 5 个展示主要功能的关键点。在此阶段清除引导、权限和 Cookie 弹窗,避免它们在正式录制中出现。
- 录制一次。
在每个想要保留的屏幕上停留约一秒。如果模拟器启动后点击立即失败,等待 20 秒再重试。scripts/record.sh start work/raw.mp4 <UDID> # 驱动应用:用户自己的模拟器工具、项目中的 XCUITest,或要求用户手动点击 scripts/record.sh stop <UDID> - 检查录制内容。 文件在最后一次画面变化时结束,因此静止的最终屏幕会被截断,从未变化的场景录制几乎是空的。根据文件时间(而非记忆)来安排场景。
打开python3 scripts/compose.py frames work/raw.mp4 workwork/contact-sheet.png:每行 8 个缩略图,第 N 个代表第 N 秒。 - 编写
storyboard.json。{ "app_name": "MyApp", "background": ["#0B1020", "#3B2AA8"], "scenes": [ {"start": 0.3, "end": 5.8, "caption": "此屏幕的功能"}, {"start": 8.0, "end": 10.0, "speed": 0.8, "caption": "下一步"} ], "end_card": {"title": "MyApp", "subtitle": "应用的独特标语"} }start/end是录制内容中的秒数。speed低于 1 会减慢场景,高于 1 会加快。hold将场景的最后一帧冻结指定秒数,用于在结果屏幕上停留。background可接受一种颜色或从上到下的渐变;text_color和caption_size可选。省略end_card则结束于最后一个场景。剪掉加载转圈。所有场景时长之和必须在 15-30 秒之间,否则 App Store Connect 会拒绝预览。 - 渲染。
命令会输出python3 scripts/compose.py render work/raw.mp4 storyboard.json outout/report.json,并在预览时长超出范围时发出警告。 - 交付前检查。 从每个场景中提取一帧(
ffmpeg -ss <t> -i out/reel-1080x1920.mp4 -frames:v 1 f.png)并检查:字幕与屏幕内容匹配,无私人信息,无内容被裁剪。
备注
- 环境要求:macOS、Xcode(使用
simctl和swift)、ffmpeg、python3。 record.sh将状态栏设置为 9:41,满电满信号。录制完成后使用xcrun simctl status_bar <UDID> clear清除。- 此处使用的 App Store 预览规范(886x1920,15-30 秒,30 fps,H.264 High 4.0,立体声 AAC)来自 Apple 的 应用预览规范。如果上传被拒绝,请参考该页面。
- 音轨为静音。如需声音,可在编辑器中添加音乐或语音。