You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在SvelteKit中使用@ffmpeg/ffmpeg压缩视频遇fetch失败错误求助

问题分析与修复方案

错误原因

  1. FFmpeg核心加载失败:在Node.js环境(SvelteKit服务器端)中,@ffmpeg/ffmpeg默认会尝试从CDN远程加载ffmpeg-core.wasm,这个过程触发的fetch请求因环境配置问题失败,报unknown scheme错误。
  2. fetchFile误用:你传入的是Node.js的Buffer对象,不需要用fetchFile处理,该方法主要用于浏览器端的File对象或网络URL。
  3. FFmpeg命令参数格式错误:ffmpeg.run()方法不需要传入'ffmpeg -i',应该直接传递FFmpeg命令的各个参数片段。
  4. 相对路径风险:使用相对路径写入文件可能导致权限或路径解析问题。

修复后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:50:22