Memoria 开发记录 22:从生成到交付——视频导出、缓存与分享链路
前言
故事视频生成完成,并不意味着功能已经完成。用户真正关心的是:能否马上播放、能否找到导出文件、能否直接分享、下次打开是否还需要重新生成,以及失败后是否能继续。
Memoria 的视频能力从离屏渲染逐步扩展到缓存管理、导出管理、直接分享和参数恢复。这个过程体现了一个产品工程原则:
计算结果只有进入稳定的交付链路,才真正成为用户可用的功能。
为什么需要离屏渲染与导出管理
视频生成往往持续较长时间,不能依赖当前页面一直存在。离屏渲染 Worker 负责根据照片、音乐、字幕和转场参数生成视频;导出管理器则负责展示进度、成功结果和失败状态。
页面只负责发起任务和观察,不应直接拥有整个渲染过程。这样用户离开故事页面后,导出仍能继续,完成后也可以统一处理。
视频缓存如何减少重复生成
提交 3ac14d0 新增 VideoCacheService,渲染前先检查是否已有可复用结果。视频生成通常比普通图片处理昂贵得多,如果用户只是返回结果页或再次点击预览,不应该重新执行完整导出。
缓存命中依赖稳定缓存键。缓存键必须覆盖所有影响输出的输入:
照片及顺序、转场、字幕、音乐、节拍、分辨率、帧率、渲染版本
漏掉任何关键参数,都可能让用户修改设置后仍看到旧视频。
缓存也需要清理和解释
提交 6c3888a 增加缓存检查和清理入口。视频缓存体积大,若只增加不清理,很快会占满设备空间。
缓存管理页至少应告诉用户:
- 当前缓存占用;
- 清理会删除哪些派生文件;
- 已手动保存或导出的作品是否受影响;
- 清理后哪些内容可以重新生成。
缓存是可重建加速层,用户作品则应由故事实体和导出文件保护,二者不能混淆。
分享不是“打开文件”这么简单
提交 f2488c1 接入 share_plus 并优化视频导出流程。移动端分享需要处理平台差异、文件可访问性、MIME 类型、临时 URI 和分享面板生命周期。
提交 bcaadd9 又重构文件管理与分享页面,替换文件打开插件并简化交互。好的分享流程应尽量直接:
导出成功 -> 立即预览或分享
已有导出 -> 直接分享,不重复渲染
文件失效 -> 根据故事参数重新生成
用户不需要理解缓存目录或内部文件路径。
导出完成后恢复参数
提交 01249be 优化导出管理和视频页面,支持完成后直接分享并恢复视频参数。只保存最终 MP4 仍然不够,因为用户可能希望重新编辑。
因此故事实体需要保存生成参数,导出结果则作为可复用派生物。这样的关系类似源代码与构建产物:
- 故事参数是源;
- 视频文件是构建结果;
- 缓存帮助加速;
- 分享是交付动作。
总结
视频功能的完成标准不是“成功生成一个文件”,而是让结果可预览、可复用、可管理、可分享和可重建。
关键经验包括:
- 长时间渲染应脱离页面生命周期;
- 缓存键必须覆盖全部输出输入;
- 大体积视频缓存需要明确清理策略;
- 用户作品与可重建缓存必须分离;
- 分享优先使用已有导出,不重复计算;
- 保存生成参数,使视频失效后仍可恢复。
对应提交:3ac14d0、6c3888a、013d389、f2488c1、bcaadd9、01249be。
浙公网安备 33010602011771号