From 31ce749a6fec0c891e1d385baf0a118943516ed6 Mon Sep 17 00:00:00 2001 From: ddCat <2695092045@qq.com> Date: Fri, 7 Aug 2026 16:30:27 +0800 Subject: [PATCH] =?UTF-8?q?fix(canvas):=20=E8=A7=86=E9=A2=91=E5=90=88?= =?UTF-8?q?=E5=B9=B6=20-=20=E6=94=B9=E7=94=A8=E5=90=8C=E6=BA=90=20FFmpeg?= =?UTF-8?q?=20=E8=B5=84=E6=BA=90=E9=81=BF=E5=85=8D=E8=87=AA=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E5=8A=A0=E8=BD=BD=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #168 --- web/bun.lock | 3 +++ web/package.json | 1 + web/src/lib/canvas/canvas-video-merge.ts | 16 ++++++++++------ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/web/bun.lock b/web/bun.lock index 1a216352d..65abdf994 100644 --- a/web/bun.lock +++ b/web/bun.lock @@ -8,6 +8,7 @@ "@ant-design/icons": "^6.3.2", "@codemirror/lang-json": "^6.0.2", "@excalidraw/excalidraw": "0.18.1", + "@ffmpeg/core": "0.12.10", "@ffmpeg/ffmpeg": "^0.12.15", "@ffmpeg/util": "^0.12.2", "@mediapipe/tasks-vision": "^1.0.1", @@ -207,6 +208,8 @@ "@excalidraw/random-username": ["@excalidraw/random-username@1.1.0", "", {}, "sha512-nULYsQxkWHnbmHvcs+efMkJ4/9TtvNyFeLyHdeGxW0zHs6P+jYVqcRff9A6Vq9w9JXeDRnRh2VKvTtS19GW2qA=="], + "@ffmpeg/core": ["@ffmpeg/core@0.12.10", "", {}, "sha512-dzNplnn2Nxle2c2i2rrDhqcB19q9cglCkWnoMTDN9Q9l3PvdjZWd1HfSPjCNWc/p8Q3CT+Es9fWOR0UhAeYQZA=="], + "@ffmpeg/ffmpeg": ["@ffmpeg/ffmpeg@0.12.15", "", { "dependencies": { "@ffmpeg/types": "^0.12.4" } }, "sha512-1C8Obr4GsN3xw+/1Ww6PFM84wSQAGsdoTuTWPOj2OizsRDLT4CXTaVjPhkw6ARyDus1B9X/L2LiXHqYYsGnRFw=="], "@ffmpeg/types": ["@ffmpeg/types@0.12.4", "", {}, "sha512-k9vJQNBGTxE5AhYDtOYR5rO5fKsspbg51gbcwtbkw2lCdoIILzklulcjJfIDwrtn7XhDeF2M+THwJ2FGrLeV6A=="], diff --git a/web/package.json b/web/package.json index 346ee1b21..a530a1691 100644 --- a/web/package.json +++ b/web/package.json @@ -16,6 +16,7 @@ "@ant-design/icons": "^6.3.2", "@codemirror/lang-json": "^6.0.2", "@excalidraw/excalidraw": "0.18.1", + "@ffmpeg/core": "0.12.10", "@ffmpeg/ffmpeg": "^0.12.15", "@ffmpeg/util": "^0.12.2", "@mediapipe/tasks-vision": "^1.0.1", diff --git a/web/src/lib/canvas/canvas-video-merge.ts b/web/src/lib/canvas/canvas-video-merge.ts index a5e29bc62..6dd8d07c9 100644 --- a/web/src/lib/canvas/canvas-video-merge.ts +++ b/web/src/lib/canvas/canvas-video-merge.ts @@ -1,5 +1,7 @@ import { FFmpeg } from "@ffmpeg/ffmpeg"; -import { fetchFile, toBlobURL } from "@ffmpeg/util"; +import ffmpegCoreURL from "@ffmpeg/core?url"; +import ffmpegWasmURL from "@ffmpeg/core/wasm?url"; +import { fetchFile } from "@ffmpeg/util"; import { getMediaBlob } from "@/services/file-storage"; export type MergeVideoInput = { id: string; url?: string; storageKey?: string }; @@ -12,12 +14,14 @@ async function loadFFmpeg(onProgress?: (progress: MergeVideoProgress) => void) { if (!ffmpegPromise) { ffmpegPromise = (async () => { const ffmpeg = new FFmpeg(); - const baseURL = "https://unpkg.com/@ffmpeg/core@0.12.10/dist/umd"; onProgress?.({ phase: "loading", progress: 0 }); - await ffmpeg.load({ - coreURL: await toBlobURL(`${baseURL}/ffmpeg-core.js`, "text/javascript"), - wasmURL: await toBlobURL(`${baseURL}/ffmpeg-core.wasm`, "application/wasm"), - }); + try { + // 核心资产随前端同源发布,避免自部署环境首次合并依赖第三方 CDN。 + await ffmpeg.load({ coreURL: ffmpegCoreURL, wasmURL: ffmpegWasmURL }); + } catch (cause) { + ffmpeg.terminate(); + throw new Error("视频合并工具加载失败,请刷新页面后重试", { cause }); + } return ffmpeg; })(); }