Node.js服务端混音需先统一转为16-bit PCM WAV格式,再用ffmpeg-static命令行直混或node-web-audio-api手动叠加波形,最后用ffmpeg替换视频音轨;关键参数包括amix=inputs=2:duration=first和-map 0:v:0 -map 1:a:0。

在 Node.js 环境中无法直接调用浏览器的 MediaRecorder 或 AudioContext,因为这些是 Web API,仅运行于浏览器上下文;Node Video 并非官方术语,实际需求是指:在服务端(Node.js)将已录制的麦克风音频文件与背景音乐混合,生成带配音的视频或纯音频输出。
确认输入源类型与格式
先检查你的麦克风录音文件(如 mic.wav)和背景音乐(如 bgm.mp3)是否为标准 PCM WAV 或已解码音频。Node.js 无法原生解析 MP3 帧,若直接混音会失败。必须统一转为 16-bit PCM、44.1kHz、立体声的 WAV 格式——这是 ffmpeg-static 和 node-wav 等库唯一能可靠读取的格式。
执行转换:ffmpeg -i bgm.mp3 -ar 44100 -ac 2 -sample_fmt s16 bgm_converted.wav。不转格式就调用 WavDecoder 会抛出 Invalid WAV header 错误。
使用 ffmpeg-static 混音(推荐,无需解码)
方法一:命令行直混(最快,适合单次任务)
安装:npm install ffmpeg-static。
在 Node.js 中 spawn ffmpeg 进程:
const ffmpeg = require('ffmpeg-static');
const { spawn } = require('child_process');
spawn(ffmpeg, [ '-i', 'mic.wav', '-i', 'bgm_converted.wav', '-filter_complex', 'amix=inputs=2:duration=first:dropout_transition=2', '-y', 'output_with_voice.mp3' ])。
【duration=first】 表示以麦克风录音时长为准截断背景音乐;若选 longest,BGM 会拖尾导致输出过长。
用 web-audio-api 兼容库在 Node 中模拟混音
方法二:使用 node-web-audio-api + wav-decoder 手动叠加波形(适合需精细控制音量/淡入淡出)
第一步:读取两个 WAV 文件为 Float32Array 数组
第二步:对齐采样点长度——短音频末尾补零,否则 array[i] + array[i] 会越界崩溃
第三步:按比例加权叠加:mixed[i] = mic[i] * 0.7 + bgm[i] * 0.4;系数超过 1.0 会导致削波失真,播放时出现爆音
第四步:用 wav-encoder 将结果写入新 WAV 文件
合成最终视频(含配音)
已有视频 video.mp4 和混音完成的音频 output_with_voice.mp3,执行替换音轨:
ffmpeg -i video.mp4 -i output_with_voice.mp3 -c:v copy -c:a aac -strict experimental -map 0:v:0 -map 1:a:0 -shortest final.mp4
【-map 0:v:0 -map 1:a:0】 显式指定只取视频流和新音频流,避免 ffmpeg 自动合并原始音轨造成双声。



















