From 93a8d641ddafdc45fe0f7afd0615c63ff669696f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=AE=8F=E6=9D=B0?= Date: Wed, 19 Aug 2026 11:49:43 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20Canvas=20+=20WebCodecs=20=E9=A2=84?= =?UTF-8?q?=E8=A7=88=E6=92=AD=E6=94=BE=E5=99=A8=E6=A0=B8=E5=BF=83=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 核心架构: - 新建 useCanvasPlayer.ts:MP4 → mp4box.js 解封装 → VideoDecoder 解码帧 → Canvas 绘制 - 帧队列环形缓冲区(最多5帧),自动释放已消费的 VideoFrame - 标题通过 Canvas drawText 合成,无需 CSS overlay - ResizeObserver 响应容器尺寸变化 双路径架构: - 浏览器支持 WebCodecs → Canvas 渲染(帧级精确控制) - 不支持 → fallback 到多 video 元素方案(opacity 切换) - isWebCodecsSupported() 运行时检测 前端播放控制: - play/pause/seek API 不变 - 配音音频同步保持不变 - 进度条 UI 保持不变 依赖: - 新增 mp4box ^2.4.1(MP4 解封装) 注:useSegmentScheduler.ts 未改动,fallback 路径继续使用 --- apps/web/package-lock.json | 10 + apps/web/package.json | 1 + .../components/FrontendPreviewPlayer.tsx | 272 +++++++---- .../pages/generate/hooks/useCanvasPlayer.ts | 450 ++++++++++++++++++ 4 files changed, 637 insertions(+), 96 deletions(-) create mode 100644 apps/web/src/pages/generate/hooks/useCanvasPlayer.ts diff --git a/apps/web/package-lock.json b/apps/web/package-lock.json index 31ff631bd..5da4b33ad 100644 --- a/apps/web/package-lock.json +++ b/apps/web/package-lock.json @@ -12,6 +12,7 @@ "@tanstack/react-query": "^5.45.0", "antd": "^5.18.0", "axios": "^1.7.2", + "mp4box": "^2.4.1", "react": "^18.3.1", "react-dom": "^18.3.1", "react-router-dom": "^6.24.0", @@ -4623,6 +4624,15 @@ "dev": true, "license": "MIT" }, + "node_modules/mp4box": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/mp4box/-/mp4box-2.4.1.tgz", + "integrity": "sha512-0HGX7nXoDIX6FKLVl4a3wtYjBlwqsN3xuQC3GXzNtKp98FXUOhDSq623azsz8DG5ptd9ZXcXodDkgbdMZOjWvw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=20.8.1" + } + }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", diff --git a/apps/web/package.json b/apps/web/package.json index 863847dad..01c638ec9 100755 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -23,6 +23,7 @@ "@tanstack/react-query": "^5.45.0", "antd": "^5.18.0", "axios": "^1.7.2", + "mp4box": "^2.4.1", "react": "^18.3.1", "react-dom": "^18.3.1", "react-router-dom": "^6.24.0", diff --git a/apps/web/src/pages/generate/components/FrontendPreviewPlayer.tsx b/apps/web/src/pages/generate/components/FrontendPreviewPlayer.tsx index c73b74b22..71666ad0a 100644 --- a/apps/web/src/pages/generate/components/FrontendPreviewPlayer.tsx +++ b/apps/web/src/pages/generate/components/FrontendPreviewPlayer.tsx @@ -1,31 +1,43 @@ /** - * 前端预览播放器(多 video 元素方案) - * 为每个片段创建独立