feat(#1741): 批量预览卡片缩小至3/5 + 每个视频播放都有声音(配音全挂载+播放互斥+静音按钮) #1742
Reference in New Issue
Block a user
Delete Branch "feat/1741-preview-grid-audio"
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?
问题
Issue #1741(staging 实测):
voiceAudioUrl={i === 0 ? voiceAudioUrl : undefined}配音只挂第 1 个变体;且所有<video>硬编码muted,无配音时素材原声也被静音改动
卡片缩小至约 3/5(
generate.css).xx-canvas-grid改grid-template-columns: repeat(auto-fill, minmax(200px, 220px))+ 居中:宽屏自动排 3 列(step4 预览列约 700~900px 内容宽下),中屏 2 列,窄屏(≤960px)单列限宽 320 居中每个视频都有声音(
FrontendPreviewPlayer.tsx/CanvasPreviewGrid.tsx)i === 0限制,N 个实例都传voiceAudioUrl(同一条 URL 浏览器缓存,不重复下载);现有 audio 随播放/暂停/seek/片段切换同步逻辑对每个实例生效muted(素材原声不与配音混音);无配音时 video 取消 muted,素材原声兜底,任何情况播放都有声(顺带修了单视频无配音也静音的旧问题)activePlayToken/onPlayTokenChange(token = variantSeed)。点某卡片播放→上报自身 token,Grid 内所有实例同步;token≠自身且正在播放的实例 effect 里自动暂停(视频+配音都停);暂停/播完上报 null 释放AudioOutlined/AudioMutedOutlined),可单独静音;默认有声;有配音时静音配音 Audio,无配音时静音素材 video.catch兜底不阻塞画面测试(+12 例,全量 705 passed)
CanvasPreviewGrid.audio.test.tsx(5 例,mock player):N=3 每个变体都拿到 voiceAudioUrl;互斥 props 接线;实例2播放→所有实例 token=2(其他自动暂停);暂停上报→token 释放;全部 has-voiceFrontendPreviewPlayer.audio.test.tsx(7 例,mock scheduler 控制播放态):有配音 video muted / 无配音 video 不 muted;静音按钮切换 muted+aria;互斥 effect(token 变他人且播放中→pause,切回不重复暂停);未播放不暂停;点播放上报自身 token 并触发 toggle;每卡片独立静音按钮验收
staging 第3步批量预览:卡片明显变小、一屏 3 个;视频 1/2/3 分别点播放都能听到配音,同时只有一个在响;喇叭按钮可单独静音;无配音素材播放有原声。
Closes #1741
🚀 预览环境已部署
CI全绿,自动审批通过。
CI全绿,自动审批通过。
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
无
💡 改进建议(不阻塞合并)
[FrontendPreviewPlayer.tsx: 426] React Hooks 依赖项风险
useEffect中使用了canvasState.isPlaying、canvasControls、videoPause、isPlaying,但通过eslint-disable-next-line将其排除在依赖数组之外。虽然这可能是为了避免每次播放状态变化都触发暂停逻辑(仅在 Token 变化时触发),但如果canvasControls或videoPause的引用在重渲染时发生了变化(例如上层 hook 返回了新的引用),这里将调用过期的闭包函数。建议确认这些引用的稳定性,或者使用useRef来保存这些函数以确保始终调用最新版本。[FrontendPreviewPlayer.tsx: 785] 内联样式维护性
style={{ ... }}),导致代码臃肿且难以复用或统一调整主题。建议将样式提取到 CSS 文件或使用 CSS-in-JS 方案(如 styled-components 或 emotion)进行管理,以提高代码的可维护性。✅ 良好实践
activePlayToken并下发,子组件监听 Token 变化自动暂停,有效解决了多路音频重叠问题。muted状态与hasVoice的组合逻辑清晰,准确实现了“有配音时视频静音,无配音时视频原声兜底”的需求。repeat(auto-fill, minmax(...))实现了较为灵活的网格布局,配合媒体查询适配了不同屏幕尺寸。✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能良好
🤖 由 AI 代码审查机器人自动生成 | 2026-09-06 07:39:09 | 模型:
🗑️ 预览环境已清理
PR #1742 已关闭或合并,对应的预览环境已被清理。