Я транскодирую кадры в реальном времени с камеры безопасности из MJPEG в MPEG2, используя ffmpeg
.
К сожалению, машина, выполняющая транскодирование, не может действительно поддерживать (100% загрузка ЦП), однако это "достаточно хорошо", и я не против случайного пропущенного кадра. Но по какой-то причине ffmpeg
не отбрасывает какие-либо кадры, поэтому использование памяти продолжает увеличиваться, поскольку процесс отстает от входящих кадров, а затем у машины заканчивается память, и видео начинает сильно повреждаться.
Есть ли какой-нибудь способ сказать ffmpeg
более агрессивно отбрасывать кадры? Проблемы возникают, когда использование памяти достигает 1,9 ГБ , поэтому я попытался использовать monit
для перезапуска процесса, когда объем памяти превышает 1,5 ГБ, однако затем он перезапускается каждые 10 минут, что нарушает предпочтительную 15-минутную длину каждого транскодированного файла.
Это команда, которую я использую:
ffmpeg -overrun_nonfatal 1 -y -i udp://1.2.3.4
-c mpeg2video -b:v 2M -vf transpose=2
-preset ultrafast -an -r 30
out.mkv
На странице руководства сказано, что опция -r
может использоваться как опция вывода для удаления кадров, однако я делаю это, и кажется, что она отбрасывает только кадры, соответствующие выходной частоте кадров (здесь 30 кадров в секунду), а не отбрасывает кадры, чтобы догнать ввод поток.
Опция -vsync
также выглядит аналогично, пытаясь соответствовать частоте кадров, а не минимизировать буферизацию.
-frame_drop_threshold
выглядит более многообещающе, но опять же, похоже, речь идет об отбрасывании кадров, чтобы не отставать от временных меток, а не о том, чтобы не отставать от кодирования в реальном времени.
Есть ли какая-то другая опция, которую я могу использовать, которая скажет ffmpeg
отбрасывать кадры по мере необходимости, чтобы избежать использования такого большого количества памяти? Я предполагаю, что это было бы в опциях реального времени / потоковой передачи / низкой задержки, но я не могу ничего найти!