Цепочка потоков Nodejs

Привет, я хотел бы связать несколько файловых потоков чтения, мое текущее использование примерно такое;

  1. создать дочерний процесс
  2. создать файлReadStream
  3. отправить содержимое файла через канал (child.stdin)
  4. вернуться к шагу 2

Я пытаюсь отправить несколько mp3-файлов с помощью канала в ffmpeg, чтобы он мог выводить бесконечный поток на основе hls и mpeg-dash.

PS: я пробовал finished событие writableStream, но если завершено, срабатывает child.stdin, закрывающийся writableStream. Если я передам флаг, чтобы не закрыть, я никогда не закончу событие.


person Yakup Türkan    schedule 01.01.2019    source источник


Ответы (1)


Я использовал потоки 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) */
person Yakup Türkan    schedule 02.01.2019