javascript - 从 nodejs 向 FFmpeg 发送 2 个流
问题描述
我正在尝试从 nodejs 向 FFmpeg发送 2 个ReadableStreams 。我曾尝试使用 fluent-ffmpeg 库来执行此操作,但它只支持发送一个流进行处理。在这里检查
我的问题是:我有 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 文件。
解决方案
假设您的源音频流是常规 PCM 音频(例如在 WAV 文件中最常见的音频),我将在您的应用程序内部合并这些流,并将单个流输出到 FFmpeg。
这可以像交替读取哪个流一样简单地完成,有效地交错样本。
如果您的样本是 16 位的,那么每个样本是两个字节。因此,您的流将如下所示:
[LL][RR][LL][RR][LL][RR]
(其中每个LL
是左通道的单个样本的 2 个字节,对于 相同RR
)
如果您要将其通过管道传输到 FFmpeg,则需要为 RAW PCM 设置适当的参数。或者,您也可以在应用程序中生成 WAV 文件头。
推荐阅读
- bluetooth - 蓝牙 LE:使用白名单扫描?
- python - 遍历Python中的上三角矩阵
- javascript - 我可以使用原型向外部类添加非静态方法吗?
- python - 等待时间,不包括程序花费的时间
- laravel - 现有 Laravel Spark 站点中的 Vue 项目
- android - 在 Android Studio 中放大时不丢失图像
- c - 我如何在c中解析这个文件
- javascript - 使用 JavaScript 代码自动填写(网站表单)和网络发布
- xcode - Xcode 13.0 主题语法着色无法识别第三方类型名称
- css - 样式标签的媒体属性和规则中的媒体之间的区别