从 nodejs 向 FFmpeg 发送 2 个流

Posted

技术标签:

【中文标题】从 nodejs 向 FFmpeg 发送 2 个流【英文标题】:Sending 2 streams to FFmpeg from nodejs 【发布时间】:2019-12-16 22:18:48 【问题描述】:

我正在尝试将 2 ReadableStreams 从 nodejs 发送到 FFmpeg。我曾尝试使用 fluent-ffmpeg 库来执行此操作,但它只支持发送一个流进行处理。检查here

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

我已成功接收到 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,
]);

如何使用 2 个流而不是 2 个文件来实现相同的目标?

编辑

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

【问题讨论】:

您应该告诉我们您使用的是什么平台,以及该源音频格式是什么。命名管道通常可以使用,但它们有一些怪癖并且并非随处可用。 我在问题中添加了更多信息。 【参考方案1】:

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

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

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

[LL][RR][LL][RR][LL][RR]

(其中每个LL 是左声道单个样本的 2 个字节,RR 也是如此)

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

【讨论】:

以上是关于从 nodejs 向 FFmpeg 发送 2 个流的主要内容,如果未能解决你的问题,请参考以下文章

nodejs fs 读取文件流一次读取多少数据

从 Angular 向 nodejs 发送 https 请求。无法发送任何数据

通过 Observable 从 Angular 向 nodejs 发送 POST 请求

从 Flutter 应用程序向 nodejs 服务器发送图像

在开发中设置用于从 Angular 向 NodeJS 发送 API 请求的服务器端口

如何使用nodejs向android chrome浏览器发送通知?