Vincent's Essays

博客园 首页 新随笔 联系 订阅 管理

Memoria 开发记录 22:从生成到交付——视频导出、缓存与分享链路

前言

故事视频生成完成,并不意味着功能已经完成。用户真正关心的是:能否马上播放、能否找到导出文件、能否直接分享、下次打开是否还需要重新生成,以及失败后是否能继续。

Memoria 的视频能力从离屏渲染逐步扩展到缓存管理、导出管理、直接分享和参数恢复。这个过程体现了一个产品工程原则:

计算结果只有进入稳定的交付链路,才真正成为用户可用的功能。

为什么需要离屏渲染与导出管理

视频生成往往持续较长时间,不能依赖当前页面一直存在。离屏渲染 Worker 负责根据照片、音乐、字幕和转场参数生成视频;导出管理器则负责展示进度、成功结果和失败状态。

页面只负责发起任务和观察,不应直接拥有整个渲染过程。这样用户离开故事页面后,导出仍能继续,完成后也可以统一处理。

视频缓存如何减少重复生成

提交 3ac14d0 新增 VideoCacheService,渲染前先检查是否已有可复用结果。视频生成通常比普通图片处理昂贵得多,如果用户只是返回结果页或再次点击预览,不应该重新执行完整导出。

缓存命中依赖稳定缓存键。缓存键必须覆盖所有影响输出的输入:

照片及顺序、转场、字幕、音乐、节拍、分辨率、帧率、渲染版本

漏掉任何关键参数,都可能让用户修改设置后仍看到旧视频。

缓存也需要清理和解释

提交 6c3888a 增加缓存检查和清理入口。视频缓存体积大,若只增加不清理,很快会占满设备空间。

缓存管理页至少应告诉用户:

  • 当前缓存占用;
  • 清理会删除哪些派生文件;
  • 已手动保存或导出的作品是否受影响;
  • 清理后哪些内容可以重新生成。

缓存是可重建加速层,用户作品则应由故事实体和导出文件保护,二者不能混淆。

分享不是“打开文件”这么简单

提交 f2488c1 接入 share_plus 并优化视频导出流程。移动端分享需要处理平台差异、文件可访问性、MIME 类型、临时 URI 和分享面板生命周期。

提交 bcaadd9 又重构文件管理与分享页面,替换文件打开插件并简化交互。好的分享流程应尽量直接:

导出成功 -> 立即预览或分享
已有导出 -> 直接分享,不重复渲染
文件失效 -> 根据故事参数重新生成

用户不需要理解缓存目录或内部文件路径。

导出完成后恢复参数

提交 01249be 优化导出管理和视频页面,支持完成后直接分享并恢复视频参数。只保存最终 MP4 仍然不够,因为用户可能希望重新编辑。

因此故事实体需要保存生成参数,导出结果则作为可复用派生物。这样的关系类似源代码与构建产物:

  • 故事参数是源;
  • 视频文件是构建结果;
  • 缓存帮助加速;
  • 分享是交付动作。

总结

视频功能的完成标准不是“成功生成一个文件”,而是让结果可预览、可复用、可管理、可分享和可重建。

关键经验包括:

  • 长时间渲染应脱离页面生命周期;
  • 缓存键必须覆盖全部输出输入;
  • 大体积视频缓存需要明确清理策略;
  • 用户作品与可重建缓存必须分离;
  • 分享优先使用已有导出,不重复计算;
  • 保存生成参数,使视频失效后仍可恢复。

对应提交:3ac14d06c3888a013d389f2488c1bcaadd901249be

posted on 2026-06-14 23:21  Vincentson  阅读(11)  评论(0)    收藏  举报