如何在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
相关产品推荐
相关产品推荐

