diff --git a/apps/web/src/pages/generate/components/FrontendPreviewPlayer.tsx b/apps/web/src/pages/generate/components/FrontendPreviewPlayer.tsx index 1acbb75b1..364abcc81 100644 --- a/apps/web/src/pages/generate/components/FrontendPreviewPlayer.tsx +++ b/apps/web/src/pages/generate/components/FrontendPreviewPlayer.tsx @@ -17,7 +17,7 @@ import { import type { AssetItem } from "@/api/assets" import type { EditingTemplate } from "@/api/editing-planner" import { useSegmentScheduler, type PlaybackSegment } from "../hooks/useSegmentScheduler" -import { useCanvasPlayer, isWebCodecsSupported } from "../hooks/useCanvasPlayer" +import { useCanvasPlayer } from "../hooks/useCanvasPlayer" interface FrontendPreviewPlayerProps { assets: AssetItem[] @@ -82,7 +82,9 @@ const FrontendPreviewPlayer: React.FC = ({ titleSettings, }) => { const segments = useMemo(() => buildPlaybackSegments(assets, template), [assets, template]) - const useWebCodecs = isWebCodecsSupported() + // 默认走原生 video 播放(浏览器硬件解码,独立线程,不阻塞 UI) + // WebCodecs 仅在明确需要时启用(保留代码作为兜底) + const useWebCodecs = false // ── 两条路径共用同一个 canvas ref(fallback 路径不使用) ── const canvasRef = useRef(null) @@ -265,32 +267,8 @@ const FrontendPreviewPlayer: React.FC = ({ const progressPercent = totalDuration > 0 ? (currentTime / totalDuration) * 100 : 0 - // ── Canvas ResizeObserver ── + // ── Canvas 容器 ref(保留声明,WebCodecs 兜底路径仍引用) ── const canvasContainerRef = useRef(null) - useEffect(() => { - if (!effectiveUseWebCodecs || !canPlay) return - const container = canvasContainerRef.current - const canvas = canvasRef.current - if (!container || !canvas) return - // 立即设置一次 canvas 像素分辨率,避免默认 300×150 导致首帧变形 - const initRect = container.getBoundingClientRect() - if (initRect.width > 0 && initRect.height > 0) { - const dpr = window.devicePixelRatio || 1 - canvas.width = initRect.width * dpr - canvas.height = initRect.height * dpr - } - const ro = new ResizeObserver((entries) => { - for (const entry of entries) { - const { width, height } = entry.contentRect - if (width > 0 && height > 0) { - canvas.width = width * window.devicePixelRatio - canvas.height = height * window.devicePixelRatio - } - } - }) - ro.observe(container) - return () => ro.disconnect() - }, [effectiveUseWebCodecs, canPlay]) // ── 未就绪 ── if (!ready || !assets.length) { @@ -385,31 +363,35 @@ const FrontendPreviewPlayer: React.FC = ({ )} - {/* ── Video 渲染层(fallback 路径,或 WebCodecs 解码失败时自动切换) ── */} + {/* ── Video 渲染层(默认路径,浏览器原生硬件解码) ── */} {!effectiveUseWebCodecs && - segments.map((seg, i) => ( -