NodeJs:如何pipe两个stream到一个产生的进程stdin(即ffmpeg)导致一个单一的输出

为了两个PCMaudio转换成MP3我使用以下内容:

function spawnFfmpeg() { var args = [ '-f', 's16le', '-ar', '48000', '-ac', '1', '-i', 'pipe:0', '-acodec', 'libmp3lame', '-f', 'mp3', 'pipe:1' ]; var ffmpeg = spawn('ffmpeg', args); console.log('Spawning ffmpeg ' + args.join(' ')); ffmpeg.on('exit', function (code) { console.log('FFMPEG child process exited with code ' + code); }); ffmpeg.stderr.on('data', function (data) { console.log('Incoming data: ' + data); }); return ffmpeg; } 

然后我把所有的东西都放在

 writeStream = fs.createWriteStream( "live.mp3" ); var ffmpeg = spawnFfmpeg(); stream.pipe(ffmpeg.stdin); ffmpeg.stdout.pipe(/* destination */); 

事情是…现在我想合并(重叠)两个stream成一个。 我已经find了如何使用ffmpeg: 如何使用ffmpeg覆盖两个audio文件

但是,ffmpeg命令需要两个input,到目前为止,我只能将一个inputstreampipe道input到pipe:0参数中。 如何在生成的命令中pipe理两个stream? 会像ffmpeg -i pipe:0 -i pipe:0...工作? 我如何用PCM数据传输两个inputstream(因为命令需要两个input)?

你可以使用命名pipe道来实现这个function,但是这并不适用于所有的平台。

我会在Node.js中进行混合 由于您的audio是正常的PCM样本,这使得这很容易。 混合,你只需将它们加在一起。

我要做的第一件事就是将你的PCM样本转换成一个通用的格式,即32位浮点数。 接下来,您将需要决定如何处理两个频道同时运行的情况,并且两个频道都会发出巨大的声音,使信号“超过”1.0或-1.0。 一种方法是将每个通道的采样值减半,然后再将它们相加。

另一个选项,取决于你想要的输出,是让它超过正常范围,并传递给FFmpeg。 FFmpeg可以采用32位浮点采样。 在那里,你可以应用适当的压缩 / 限制 ,使编码后的信号回到MP3下。