Порожденный процесс ffmpeg в потоке преобразования nodejs с управлением потоком не обрабатывает входной поток

Я реализовал класс потока преобразования node.js, который порождает ffmpeg и передает преобразованный поток с контролируемой скоростью в реальном времени. Ниже мой метод _transform().

      this.rcvd += chunk.length
console.log('received bytes %d', this.rcvd)
const ready = this.ffmpeg.stdin.write(chunk, encoding, err => err
  ? cb(err)
  : ready
    ? cb
    : this.ffmpeg.stdin.once('drain', cb))

Я хочу писать в поток stdin ffmpeg до тех пор, пока он не вернет false, после чего я жду, пока событие слива запишет больше данных.

В то же время у меня есть таймер, который срабатывает каждые 40 миллисекунд, считывает стандартный вывод ffmpeg и помещает его на выход потока преобразования (на читаемую сторону). Код неполный, но следующее описывает его хорошо.

      const now = Date.now()
const bytesToTransmit = (now - this.lastTx) * 32

const buf = this.ffmpeg.stdout.read()

if (buf == null) return

if (buf.length <= bytesToTransmit) {
  this.push(buf)
  this.lastTx += buf.length * 32
  return
}

this.push(buf.slice(0, bytesToTransmit))
this.lastTx = now

// todo(handle pending buffer)
this.pending = buf.slice(bytesToTransmit)

Проблема, с которой я столкнулся, заключается в том, что первая запись (65 КБ) возвращает false, и после этого я никогда не получаю событие слива. FFMpeg не начинает обрабатывать данные до тех пор, пока не будет записано определенное количество данных (в моем случае 256 КБ), и как только я начинаю ждать события слива, я никогда не восстанавливаю управление.

Я пробовал несколько вариантов ffmpeg, таких как nobuffer, но безрезультатно. Что я делаю не так? Любые идеи будут очень полезны.

Спасибо!

0 ответов

Другие вопросы по тегам