fix: 视频预加载优化+配音时长校验提醒 (#1435) #1435
Reference in New Issue
Block a user
Delete Branch "fix/preview-player-v9"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
修复内容
1. 视频播放流畅性优化
video.load()确保浏览器真正开始加载数据readyState >= 3,否则监听canplay事件 + 300ms 超时兜底display: none/block切换,改用opacity: 0 + pointer-events: none + z-index,保持所有 video 在 DOM 渲染树中,避免浏览器中断预加载2. 配音时长校验提醒
totalVideoDurationtotalVideoDuration未传入或为 0 时不做校验涉及文件
useSegmentScheduler.tsFrontendPreviewPlayer.tsxGeneratePage.tsxGenerateStepContent.tsxStep5VoiceSelect.tsx🚀 预览环境已部署
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
tick函数(由requestAnimationFrame驱动)中,当切换到下一个视频片段时,如果nextVideo.readyState < 3,代码会添加setTimeout和addEventListener。由于tick会在动画帧中持续调用,在视频加载完成前的每一帧都会重复执行这段代码,导致向同一个 video 元素绑定数十甚至上百个相同的canplay监听器和定时器。这不仅会造成严重的内存泄漏和性能下降,还会导致视频加载后触发多次play()调用。Set或Ref记录正在等待加载的 video 索引),确保对同一个 video 的canplay监听器和超时逻辑只注册一次。或者仅在片段切换的瞬间执行一次等待逻辑,而不是在 RAF 循环中反复判断。💡 改进建议(不阻塞合并)
[apps/web/src/pages/generate/hooks/useSegmentScheduler.ts: 316-323] 强制全量加载可能影响性能
useEffect中遍历所有 video 元素并调用.load()。如果segments数量较多(例如长视频包含几十个片段),这将同时发起大量网络请求,导致带宽拥塞和页面卡顿。建议改为仅预加载当前片段及后续的 1-2 个片段(懒加载策略),或者仅在视频元素首次挂载时加载。[apps/web/src/pages/generate/GeneratePage.tsx: 115] 魔法数字缺乏解释
30(默认时长)和10(兜底时长)。建议将其提取为常量并添加注释,说明这些数值的业务含义(例如:DEFAULT_ASSET_DURATION = 30),以提高代码可读性和可维护性。✅ 良好实践
Step5VoiceSelect.tsx中增加了配音时长与视频时长的校验逻辑,并通过 Modal 给用户明确的提示,有效提升了用户体验,避免了因时长不匹配导致的播放事故。GeneratePage.tsx中使用useMemo计算totalVideoDuration,依赖项准确,避免了不必要的重复计算。🤖 由 AI 代码审查机器人自动生成 | 2026-08-19 03:20:20 | 模型:
CI全绿,自动审批通过。
CI全绿,自动审批通过。
🗑️ 预览环境已清理
PR #1435 已关闭或合并,对应的预览环境已被清理。