从 nodejs 向 FFmpeg 发送 2 个流

Syl*_*ens 5 javascript ffmpeg node.js google-speech-api web-audio-api

我正在尝试从 nodejs 向 FFmpeg发送 2 个ReadableStreams。我曾尝试使用 fluent-ffmpeg 库来做到这一点,但它只支持发送一个流进行处理。在这里查看

我的问题是:我有 2 个传入的单声道音频流,我想将它们发送到 ffmpeg 以创建立体声流,然后将其发送到 google 的语音到文本服务,以生成转录。

我已成功接收到 nodejs 服务器的两个单声道流。如何利用 FFmpeg 实时合并它们仍然不清楚,我可以生成一个 FFmpeg 子进程,但我不确定如何将 2 ReadableStreams作为输入并作为另一个流获取输出?FFmpeg 支持多个输入流。

如果使用此代码将两个单声道流放在两个单独的文件中,我可以合并它们。

const { spawn } = childProcess;
const ffmpeg = spawn('ffmpeg', [
  '-i', this.phoneAudioFile,
  '-i', this.micAudioFile,
  '-filter_complex', '[0:a][1:a]amerge=inputs=2[a]',
  '-map', '[a]',
  this.outputLosslessFile,
]);
Run Code Online (Sandbox Code Playgroud)

如何使用 2 个流而不是 2 个文件实现相同的效果?

编辑

  • 传入的流都具有 PCM 音频数据。
  • 整个过程在 linux Ubuntu 服务器上运行。
  • 最终输出必须是 wav 文件。

Bra*_*rad 2

假设您的源音频流是常规 PCM 音频(例如 WAV 文件中最常见的音频),我将在您的应用程序内部合并这些流,并将单个流输出到 FFmpeg。

这可以像交替读取哪个流一样简单地完成,从而有效地交错样​​本。

如果您的样本是 16 位,则每个样本都是两个字节。因此,您的流将如下所示:

[LL][RR][LL][RR][LL][RR]
Run Code Online (Sandbox Code Playgroud)

(其中每个LL是左通道单个样本的 2 个字节,并且 相同RR

如果要将其通过管道传输到 FFmpeg,则需要为 RAW PCM 设置适当的参数。或者,您也可以在应用程序中生成 WAV 文件头。