Как ограничить использование памяти ffmpeg

Я использую ffmpeg для преобразования видео 1080p в MP4 с помощью этой команды в PHP.

$command = FFMPEG.' -i ' . $src . ' -sameq -strict -2 -vcodec libx264 -ar 22050 -y ' . $dest.'.mp4 2>&1'; exec($command,$output,$status); 

Проблема заключается в том, что в процессе используется много памяти ~ 1600 МБ, что не разрешено моим сервером, поэтому ffmpeg завершается. Могу ли я ограничить использование памяти ffmpeg примерно до 600-700 МБ?

Любая помощь приветствуется …

Речь идет не о PHP. Речь идет о том, как ограничить использование памяти FFMPEG.

Короткий ответ нет!

Смотрите здесь: http://hwdmediashare.co.uk/forum/27-development-customisation/54700-limit-ffmpeg-memory-usage

Это будет видеокодек, который в основном отвечает за использование высокой памяти.

Таким образом, это кодер, использование памяти которого необходимо решить, а не FFmpeg напрямую. Я не уверен, как исправить использование памяти x264 , но я попробовал новый x26 5, и в моем случае он использует только 1,6 ГБ, в то время как libx264 терпел неудачу, запрашивая больше, чем ограничение на 2 ГБ памяти (за процесс, на 32 -битные системы).

Итак, что сработало для меня, было использовать:

 ffmpeg -i input -pix_fmt yuv420p -c:v hevc -x265-params crf=23 out.mp4 

(Опускание параметров для ухода за звуком.)

Но общий подход – попробовать другие кодеры. Я собирался попробовать mpeg4 и vp9, если x265 не работал, может быть, другие. Если ни одно из них не работает, дополнительные параметры включают просмотр настроек кодировщика (хотя ничего очевидного и непосредственно не связано с использованием памяти):

 ffmpeg -h encoder=mpeg4 

Обновление: на самом деле выяснилось, что YouTube еще не принимает HEVC (он же H.265) (и это только сообщит мне после завершения загрузки). Итак, как я уже говорил выше, я пошел на VP9, ​​выполнив пилотный запуск с использованием первых 50 кадров на этот раз. Я использовал настройки, похожие на руководство, которое я нашел (настройки качества Constant , хотя я должен был использовать больше предлагаемых параметров):

 ffmpeg.exe -i <input> -pix_fmt yuv420p -c:v libvpx-vp9 -pass 1 -b:v 0 -crf 20 -f webm pass1.webm ffmpeg.exe -i <input> -pix_fmt yuv420p -c:v libvpx-vp9 -pass 2 -b:v 0 -crf 20 -f webm pass2.webm 

(Обратите внимание, что pass1.webm будет почти пустым.)

Также обратите внимание, что по возможности возможны два прохода. Это лучше на всех фронтах, включая более быструю кодировку в целом.

С этими настройками 73-секундный клип с разрешением 4K занимал около 16 часов для кодирования – это использование одного ядра, поскольку я забыл указать -threads . В то время как медленное использование памяти FFmpeg только увеличилось до 0,6 ГБ. Итоговый файл был 300 МБ, и я не вижу потери качества по сравнению с несжатыми кадрами (так что -crf 20 может быть слишком низким).

Истина заключается в кодировании видео в CPU и работе с памятью. Если вы хотите это сделать, вам нужно предоставить необходимую память.

Так как вы хотите преобразовать 1080p .mov в .mp4 того же качества, я предполагаю, что вы хотите изменить формат файла, а не перекодировать.

ffmpeg -i input.mov -acodec copy -vcodec copy out.mp4

будет делать это в одно мгновение и без каких-либо накладных расходов памяти

Если вы хотите, чтобы только ваш аудиокодек изменился, не выделяйте часть acodec.

Если входной видеокодек не работает для вас [так что копия не является параметром], попробуйте сделать mpeg4-кодировку для vcodec. Дешевле кодировать, но я не могу заверить вас, что он всегда будет соответствовать вашим требованиям к памяти.