NodeJs:如何将两个流传输到一个生成的进程stdin(即ffmpeg),从而产生单个输出

时间:2017-11-23 17:35:21

标签: node.js audio ffmpeg stream audio-streaming

为了将PCM音频转换为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 */); 

事情是......现在我想将两个流合并(叠加)成一个。我已经找到了如何使用ffmpeg:How to overlay two audio files using ffmpeg

但是,ffmpeg命令需要两个输入,到目前为止我只能将一个输入流输入pipe:0参数。如何在生成的命令中管道两个流?像ffmpeg -i pipe:0 -i pipe:0...之类的东西会起作用吗?如何使用PCM数据管道两个传入流(因为命令需要两个输入)?

1 个答案:

答案 0 :(得分:1)

您可以使用命名管道,但这并不适用于所有平台。

我宁愿在Node.js中进行混音。由于您的音频采用普通PCM样本,因此这很容易。要混合,只需将它们一起添加即可。

我要做的第一件事就是将PCM样本转换为通用格式... 32位浮点数。接下来,您必须决定如何处理两个通道同时运行并且两者都携带大声的情况,以便信号将“剪切”#34;超过1.0或-1.0。一种选择是在将每个频道的样本值加在一起之前将其简单地切成两半。

根据您所需的输出,另一个选项是让它超出正常范围并将其传递给FFmpeg。 FFmpeg可以接收32位浮点样本。在那里,您可以应用适当的compression / limiting,以便在编码为MP3之前将信号恢复到裁剪状态。