Я использую 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. Дешевле кодировать, но я не могу заверить вас, что он всегда будет соответствовать вашим требованиям к памяти.