1

你好我想链接一些fileReadStreams,我目前的使用是这样的;

  1. 产生一个子进程
  2. 创建一个文件ReadStream
  3. 通过管道发送文件内容(child.stdin)
  4. 循环回到步骤 2

我正在尝试使用管道将一些 mp3 文件发送到 ffmpeg,因此它可以输出无限的基于 hls&mpeg-dash 的流。

PS:我尝试finished了 writableStream 的事件,但如果完成会触发 child.stdin 被 writableStream 关​​闭。如果我通过标志不关闭,我永远不会完成事件。

4

1 回答 1

0

我使用过 PassThrough 流,结果并不完美,但在我的情况下没关系。如果有人需要这样的东西,我就是这样处理的;

const {PassThrough} = require('stream');

const pt = new PassThrough();

/* spawn child process */
/* PS: I do not know why direct pipe to ffmpeg does not work in my case throws pipe: Permission denied */
const child = spawn(
    'cat',
    ['|', 'ffmpeg', ...],
    {
        stdio: ['pipe', 'inherit', 'inherit'],
        shell: true
    });

pt.pipe(child.stdin);

/* pass streams to pt stream with end false parameter */
stream1.pipe(pt, { end: false }); /* This also prevents stream1 finished event, but otherwise it would close the pt stream. */
stream2.pipe(pt, { end: false }); /* Or you can handle this part programmatically(loops, generators etc) */
于 2019-01-02T00:43:25.860 回答