# 14 素材确认、暂停取消和进程恢复时序 听文视频工作台 · 技术架构与实现 · 1.0.2 图示:版本+内容摘要保护 版本+内容摘要保护 状态/版本失败 摘要不一致 用户检查当前素材 MP3 ready+图片 ready POST confirm 发送当前image_version 后端状态与版本校验 无暂停/取消/活动冲突 记录确认版本与SHA256 当前有序图片字节摘要 视频worker再次核对 版本一致+内容摘要一致 开始本机编码 通过后发布MP4 换图/删图/重生成 新image_version · 清确认 拒绝旧确认或变更素材 重新查看图片并再次确认 图4|素材确认双闸门。客户端版本、服务端版本和worker内容摘要必须一致;变化后回到重新预览。小屏可横向滚动查看图示 确认既检查状态,又固定当前素材版本:音频和图片ready、未暂停/取消、客户端image_version等于当前、无ACTIVE,计算当前图片按顺序连接字节的SHA256,保存confirmed_version与confirmed_digest。video若已queued/working/done,重复confirm直接返回状态,不启动第二编码。 worker开始再次核对version与digest。换图、删图、重生成均使旧确认失效。这个闸门避免客户端旧预览确认新文件,也避免确认后磁盘素材变化;它不是对图片内容是否合适的自动审核。 ## 控制语义 - Control共享paused与cancelled线程事件,音频异步流与合并步骤在检查点等待/退出;本机画面循环和编码循环也检查取消。 - pause不撤销已经提交Seedream请求。返回已付费素材时尽量保存,后续成片仍停止。 - cancel令正在处理步骤响应取消,并将未运行但busy的步骤改cancelled;真正终止以worker退出和ACTIVE清除为准。 - resume只清暂停/取消标志;不会自动launch cancelled/interrupted步骤。用户分别选择重试音频、重新选图、图片重试或confirm恢复视频。 ## recover与重启 Python服务启动调用recover扫描job.json,原queued/working改interrupted并提示手动重试,paused清false;ready/done及实际文件保留,submitting等未知收费信息保留。不自动TTS、不自动重新编码、更不会因重启自动重发收费图。 已成功part可在音频重试复用。failed/manual URL需要用户重新提供URL,因为Control.photo_url只在内存;历史图片则可直接读取。进程死亡时ACTIVE与Control不持久保存,只能根据任务JSON把活动状态改为待恢复。 源码中的recover/jobs扫描未对每个损坏job.json分别捕获错误,坏JSON可能使恢复或历史列表失败;文档不能承诺所有磁盘损坏自动修复。前台服务START_STICKY也不等于自动恢复每个任务步骤。 图示:正常制作时序 用户/WebView Flask+调度 语音/图片 视频worker 私有文件 1 创建任务,验证并冻结快照 2 写job.json并准备本机图片 3 启动语音/网络配图步骤 4 片段和图片验证后发布 5 轮询返回ready,用户预览 6 confirm当前图片版本 7 保存确认摘要,launch视频 8 cover/ffconcat/MP4临时编码 9 probe通过,replace成片 10 done与作品入口;主动导出 图12|一次正常制作的调用时序示意。网络配图可与TTS并行;这里展示阶段依赖,不表达精确耗时。小屏可横向滚动查看图示 依据:app.py:48–58,747–819,871–880、android_runtime.py:58–110、speech.py:46–89,118–166。 --- 招商合作微信:wzqy2019。添加备注:听文合作。 原网页:https://tingwen-creator-studio-102.pages.dev/guide/technical-14