3

Я транскодирую кадры в реальном времени с камеры безопасности из 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 отбрасывать кадры по мере необходимости, чтобы избежать использования такого большого количества памяти? Я предполагаю, что это было бы в опциях реального времени / потоковой передачи / низкой задержки, но я не могу ничего найти!

1 ответ1

2

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

Библиотека libavformat предоставляет некоторые общие глобальные параметры, которые могут быть установлены на всех муксерах и demuxersock:

rtbufsize integer (вход)

    Установите максимальную память, используемую для буферизации кадров в реальном времени.

Источник: документация Форматы FFmpeg

Предполагая, что вы хотите ограниченный буфер в 150 МБ, попробуйте это:

ffmpeg -rtbufsize 150M -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

Это означает, что, хотя машина не может идти в ногу, она начинает заполнять входящие данные в ОЗУ, заполняя таким образом буфер, который, когда он достигает предела, начинает сильно сбрасывать кадры.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .