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

如何在Node.js中使用FFmpeg.wasm为视频添加音频?

使用FFmpeg.wasm为视频添加背景音频的正确实现

你的代码存在几个关键问题,导致无法完成音频合并:

  • 未将音频文件写入FFmpeg.wasm的虚拟文件系统
  • FFmpeg命令参数错误,未正确指定双输入与输出逻辑
  • 输出文件与原输入文件同名,会导致覆盖风险

以下是修正后的完整代码:

import { readFile, writeFile } from "fs/promises";
import { FFmpeg } from "@ffmpeg.wasm/main";
import path from "path";

const currentDirectory = process.cwd();

// 输入文件路径
const videoInputPath = path.join(currentDirectory, "Reel3.mp4");
const audioInputPath = path.join(currentDirectory, "wolf-howl-6310.mp3");
// 输出文件路径(避免覆盖原文件)
const outputFilePath = path.join(currentDirectory, "Reel3_with_audio.mp4");

// 初始化FFmpeg实例
const ffmpeg = await FFmpeg.create({ core: "@ffmpeg.wasm/core-mt" });

try {
  // 将视频和音频文件写入FFmpeg虚拟文件系统
  await ffmpeg.fs.writeFile("input_video.mp4", await readFile(videoInputPath));
  await ffmpeg.fs.writeFile("input_audio.mp3", await readFile(audioInputPath));

  // 执行FFmpeg合并命令:
  // -i 指定输入文件(视频+音频)
  // -c:v copy 直接复制视频流,无需重新编码
  // -c:a aac 编码音频为AAC格式(保证兼容性)
  // -shortest 让输出时长取视频和音频中较短的那个
  await ffmpeg.run(
    "-i", "input_video.mp4",
    "-i", "input_audio.mp3",
    "-c:v", "copy",
    "-c:a", "aac",
    "-shortest",
    "output_video.mp4"
  );

  // 将处理后的文件写入本地
  const outputData = await ffmpeg.fs.readFile("output_video.mp4");
  await writeFile(outputFilePath, outputData);

  console.log("音频合并完成!输出文件:", outputFilePath);
} catch (error) {
  console.error("处理出错:", error);
} finally {
  // 清理FFmpeg资源
  await ffmpeg.terminate();
  process.exit(0);
}

关键说明:

  • 虚拟文件系统操作:必须将本地的视频和音频文件都写入FFmpeg.wasm的虚拟文件系统,才能被FFmpeg命令识别
  • FFmpeg命令参数:
    • -c:v copy 跳过视频编码,大幅提升处理速度
    • -c:a aac 将音频编码为AAC格式,确保输出视频在多数播放器中兼容
    • -shortest 避免其中一个媒体流过长导致输出冗余内容
  • 输出文件命名:不要直接覆盖原视频文件,防止数据丢失

内容的提问来源于stack exchange,提问作者James

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:52:54