ffmpeg недостаточно быстро читает стандартный ввод - PullRequest
0 голосов
/ 05 марта 2019

У меня есть программа NodeJS, которая запускает ffmpeg (с child_process), а затем предоставляет видеоданные в реальном времени через stdin, используя протокол канала.

ffmpeg -nostdin -i pipe:0 -codec libx264 -preset veryfast -tune zerolatency -acodec aac -b:a 128k output/index.m3u8

ffmpeg транскодирует видео в h264 и смешивает его в HLSпрямой эфир.

Проблема, с которой я столкнулся, заключается в том, что иногда ffmpeg отказывается принимать больше входных данных.Поведение NodeJS по умолчанию заключается в буферизации ввода до тех пор, пока дочерний процесс не сможет его принять, но через некоторое время это приводит к тому, что моему приложению не хватает памяти.

Я попробовал наивное решение, в котором, если ffmpeg не смогчитать входные данные (если proc.stdin.write возвращает false) Я бы начал сбрасывать данные до тех пор, пока в потоке не было сгенерировано событие drain, но это неудивительно, что это привело к сильно ухудшенному выводу видео с ужасными артефактами.

Природаисточника данных делает невозможным блокирование, мое приложение должно иметь дело с ним в режиме реального времени.

ffmpeg использует только часть доступных ресурсов в системе (35% ЦП, ~ 1% disk), поэтому я не уверен, почему он блокирует стандартный ввод.Если я укажу более требовательный пресет, то он с радостью использует больше процессора, поэтому скорость процессора не должна быть ограничивающим фактором.

Кто-нибудь знает, почему ffmpeg блокирует стандартный ввод?Есть ли способ, которым я могу сказать ffmpeg отбрасывать кадры, если он начинает отставать?

...