Есть ли способ ограничить использование памяти FFmpeg?

Есть ли способ ограничить использование памяти FFmpeg?

Я использую FFmpeg через командную строку для кодирования видео из контейнера Docker на виртуальной машине под управлением Windows Server 2016. Меня беспокоит, что это использует большой процент доступной оперативной памяти. Это нежелательно, так как у меня есть множество других контейнеров, работающих на той же виртуальной машине.

Можно ли ограничить объем оперативной памяти, используемый FFmpeg, с помощью настройки или аргумента командной строки?Если нет, то как я могу добиться аналогичного результата?

Ниже приведены некоторые (неидеальные) возможности, которые я рассматривал вне FFMPEG. Буду признателен за любые мысли по этому поводу.

  • Используйте диспетчер системных ресурсов Windows для ограничения использования оперативной памяти процессами
  • Применить логику, которая позволяет FFmpeg начинать кодирование только при наличии 8+ ГБ ОЗУ
  • Запустите его в докере с ограниченным объемом оперативной памяти.

Проблема с использованием памяти (4 ГБ+) возникает, когда я конвертирую (небольшие 35 МБ) видео в GIF с помощью этой команды:

ffmpeg -i C:\test\vidmp4.mp4 -vf "fps=24,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" C:\temp\testgif.gif

решение1

ffmpegне использует оперативную память, что на самом деле непотребности. Обычно это очень мало.

Если ваши ffmpegпроцессы действительно используют много оперативной памяти (а не неправильная интерпретация какого-то чтения), то ограничение выделения им оперативной памяти просто приведет к сбою с условием OOM.

Если вы расскажете нам о своей ffmpegкомандной строке, мы, возможно, сможем предложить альтернативы, использующие меньше оперативной памяти.

решение2

Я столкнулся с обширным использованием RAM при использовании фильтра разделения. В некоторых ситуациях я получал гораздо меньшее использование RAM, избегая фильтра разделения.

Вместо использования разделения вы можете попробовать загрузить одни и те же входные данные дважды и обрабатывать их по отдельности, пока не объедините их (возможно, за счет дополнительного времени обработки).

Так что в вашем случае попробуйте что-то вроде:

ffmpeg -i C:\test\vidmp4.mp4 -i C:\test\vidmp4.mp4 -vf "[0:v]fps=24,scale=320:-1:flags=lanczos[s0];[1:v]fps=24,scale=320:-1:flags=lanczos[s1];[s0]palettegen[p];[s1][p]paletteuse" C:\temp\testgif.gif

Связанный контент