在SvelteKit中使用@ffmpeg/ffmpeg压缩视频遇fetch失败错误求助
问题分析与修复方案
错误原因
- FFmpeg核心加载失败:在Node.js环境(SvelteKit服务器端)中,
@ffmpeg/ffmpeg默认会尝试从CDN远程加载ffmpeg-core.wasm,这个过程触发的fetch请求因环境配置问题失败,报unknown scheme错误。 - fetchFile误用:你传入的是Node.js的Buffer对象,不需要用
fetchFile处理,该方法主要用于浏览器端的File对象或网络URL。 - FFmpeg命令参数格式错误:
ffmpeg.run()方法不需要传入'ffmpeg -i',应该直接传递FFmpeg命令的各个参数片段。 - 相对路径风险:使用相对路径写入文件可能导致权限或路径解析问题。
修复后的代码
1. /src/lib/compress/Dolo.js
// @ts-ignore import fs from 'fs'; import path from 'path'; // @ts-ignore import { createFFmpeg } from '@ffmpeg/ffmpeg'; // 配置使用本地FFmpeg核心文件,避免远程请求 const ffmpeg = createFFmpeg({ log: true, corePath: path.join(process.cwd(), 'node_modules/@ffmpeg/core/dist/ffmpeg-core.js') }); // @ts-ignore export async function dolo(inputBuffer) { try { await ffmpeg.load(); // 直接将Buffer写入FFmpeg虚拟文件系统 ffmpeg.FS('writeFile', 'input.avi', inputBuffer); // 正确传递FFmpeg压缩参数,这里用H.264编码+CRF28的平衡配置 await ffmpeg.run('-i', 'input.avi', '-vcodec', 'libx264', '-crf', '28', 'output.mp4'); // 读取处理后的文件Buffer const outputBuffer = ffmpeg.FS('readFile', 'output.mp4'); // 使用绝对路径保存输出文件 const savePath = path.join(process.cwd(), 'output.mp4'); await fs.promises.writeFile(savePath, outputBuffer); console.log('压缩完成,文件路径:', savePath); } catch (e) { console.error('压缩失败:', e); } finally { // 退出FFmpeg释放资源 ffmpeg.exit(); } }
2. +page.server.ts
import { dolo } from '$lib/compress/Dolo'; import type { Actions } from './$types'; export const actions: Actions = { default: async ({ request }) => { const data = await request.formData(); const file = data.get('file-input') as File; const arrayBuffer = await file.arrayBuffer(); const buffer = Buffer.from(arrayBuffer); // 必须加await等待压缩完成 await dolo(buffer); return { success: true }; } };
额外注意事项
- 压缩参数可按需调整:
-crf值范围18-28,值越小画质越高、文件越大;也可添加-preset参数调整压缩速度(如-preset medium)。 - 处理大文件时需注意服务器内存限制,必要时可添加流式处理逻辑。
- 确保Node.js版本在14.x及以上,避免兼容性问题。
内容的提问来源于stack exchange,提问作者Mc-adams
相关产品推荐
相关产品推荐

