Порожденный процесс 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, но безрезультатно. Что я делаю не так? Любые идеи будут очень полезны.
Спасибо!