refactor: 预览播放器架构改造 - 前端素材切片播放替代FFmpeg预览渲染 #1414
Reference in New Issue
Block a user
Delete Branch "refactor/frontend-preview-player"
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?
改造概述
将 Step5 预览视频从后端 FFmpeg 渲染改为前端素材切片播放,实现真正的实时预览。
改造内容
新增文件
FrontendPreviewPlayer.tsx— 前端预览播放器组件,用原生<video>标签按时间线播放素材片段useSegmentScheduler.ts— 素材片段调度器 Hook,控制片段无缝切换、预加载、播放/暂停/拖拽usePreviewAssets.ts— 预览素材加载 Hook,根据选中素材 ID 批量获取视频文件信息修改文件
PreviewVideoPanel.tsx— 改为渲染 FrontendPreviewPlayer + TitleOverlay CSS 叠加层Step5GeneratePreview.tsx— 精简为标题样式编辑面板,移除后端预览生成按钮和轮询状态GeneratePage.tsx— 移除 useStep5Preview 调用,改用 usePreviewAssets 加载素材传给预览面板GenerateStepContent.tsx— 移除 Step5 预览相关 props 传递useGenerateVideo.ts— 当 previewTaskId 为空时,在确认生成时自动创建后端任务useStepNavigation.ts— 更新 Step5 导航校验提示文案删除文件
useStep5Preview.ts— 整个文件删除,后端预览轮询逻辑全部移除架构变化
/generation/preview,FFmpeg 渲染 480p 视频技术实现
useSegmentScheduler使用requestAnimationFrame检测播放位置,到达出点时自动切换下一段duration_min截取播放TitleOverlay组件,坐标参数与后端 ASS 字幕对齐不变的部分
TitleStylePanel、TitlePresetsGrid等样式面板组件不变useGenerateVideo中确认生成流程保留(自动创建后端任务)验证方式
🤖 Generated with Coze
🚀 预览环境已部署
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
[PreviewVideoPanel.tsx: 48-50] 标题垂直定位单位错误
getPositionStyle函数中,top和bottom定位使用了固定像素值(ASS_TITLE_MARGIN_TOP即 60px),而left/right使用了百分比。由于预览容器是响应式的(高度不固定),使用固定像素会导致标题在预览中的垂直位置与后端 FFmpeg 渲染(基于 720p 高度)的实际位置不一致,出现“所见非所得”的严重偏差。ASS_VIDEO_HEIGHT(720) 的百分比,例如:top: ${(ASS_TITLE_MARGIN_TOP / ASS_VIDEO_HEIGHT) * 100}%,以保持与字体大小缩放逻辑一致。[FrontendPreviewPlayer.tsx: 52] 缺少视频 URL 有效性校验
buildPlaybackSegments中,videoUrl直接取asset.file_url || asset.storage_key。如果素材数据异常导致两者均为空,videoUrl将为undefined。这会导致后续的播放器逻辑尝试加载无效资源(src="undefined"),可能导致播放器卡死、控制台报错或预览功能失效。if (!url) continue;。💡 改进建议(不阻塞合并)
useGenerateVideo的previewTaskId参数从原来的step5Preview.selectedTaskId改为硬编码的空字符串""。虽然架构改为前端预览,但需确认后端最终生成接口(Step 7)是否不再依赖preview_task_id来关联任务或获取缓存。如果后端仍期望该字段,将导致最终生成失败。建议确认useGenerateVideo内部实现或后端接口已同步适配。✅ 良好实践
FrontendPreviewPlayer.tsx中使用useMemo缓存片段计算,避免不必要的重复计算。PreviewVideoPanel.tsx中字体大小计算使用了百分比(size / 720) * 100,实现了良好的响应式缩放。useState和相关导入,代码清理较彻底。Math.max(0, Math.min(1, ...))有效防止了越界。🤖 由 AI 代码审查机器人自动生成 | 2026-08-17 18:05:57 | 模型:
CI全绿,自动审批通过。
CI全绿,自动审批通过。
🗑️ 预览环境已清理
PR #1414 已关闭或合并,对应的预览环境已被清理。