【问题标题】:NodeJs: How to pipe two streams into one spawned process stdin (i.e. ffmpeg) resulting in a single outputNodeJs:如何将两个流通过管道传输到一个生成的进程 stdin(即 ffmpeg)中,从而产生一个输出
【发布时间】:2018-05-07 17:44:24
【问题描述】:

为了将 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 数据对两个传入流进行管道传输(因为该命令需要两个输入)?

【问题讨论】:

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


    【解决方案1】:

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

    我会改为在 Node.js 中进行混合。由于您的音频是普通的 PCM 样本,这很容易。要混合,您只需将它们加在一起即可。

    我要做的第一件事是将您的 PCM 样本转换为通用格式... 32 位浮点数。接下来,您必须决定如何处理两个通道同时运行并且都带有响亮声音的情况,这样信号将“削波”超过 1.0 或 -1.0。一种选择是简单地将每个通道的样本值减半,然后再将它们相加。

    根据您所需的输出,另一个选项是让它超出正常范围并将其传递给 FFmpeg。 FFmpeg 可以接收 32 位浮点样本。在那里,您可以应用适当的compression/limiting 将信号带回削波状态,然后再编码为 MP3。

    【讨论】:

    • @KeyneViana 在这种情况下您真正需要做的就是切换到实时遥控器,对吗?有很多解决方案可以做到这一点(Liquidsoap 很受欢迎,以及基于它构建的各种解决方案),但我不喜欢其中任何一个。我正在为此构建自己的系统,以实现从一个位置到另一个位置的样本精确切割。事实上,您可以让一个远程 DJ 与另一个远程 DJ 交接,新 DJ 可以与前一个 DJ 进行混音和节拍匹配。都活着。但它仍处于开发阶段,尚未准备好用于一般用途。
    • @KeyneViana 知道了,所以您想拥有 Auto DJ,但有人在播放音乐时拿着麦克风进来说话?
    • 同步部分是一个未解决的问题。这就是为什么我要构建软件来做到这一点......据我所知,没有人以其他方式解决它。您实际上需要将时钟主机从一个地方转移到另一个地方,然后再回来。这需要及时回溯,这意味着需要在端点之间建立至少 2 倍延迟的缓冲区,并在交换机完成后重新建立。 (这可以通过定期插值,插入不存在的样本来完成。)
    • 我可以在浏览器上同步加入它的麦克风和音乐,并发送到liquidsoap/icecast。这些文件存储在服务器上,因此它们通过套接字流式传输到浏览器。我正在为此使用 MediaSource,但遇到了另一个问题,并为这个仍未得到解答的问题提供了悬赏:stackoverflow.com/questions/23301496/… 如果您对此问题有任何想法,请在此处留言。
    • @KeyneViana 如果需要,我可以咨询。请通过 brad@audiopump.co 与我联系以获取更多信息。
    猜你喜欢
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2018-12-03
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    相关资源
    最近更新 更多