Как минимизировать использование CPU / памяти ffmpeg при записи видео

Я использую FFmpeg для захвата видео с экрана Xvfb.

В настоящее время я вызываю его: Кроме того, использование памяти составляет около 300 МБ для каждого из процессов ffmpeg.

Какие параметры для ffmpeg я должен использовать, чтобы минимизировать использование ресурсов компьютера (особенно ЦП и памяти) при выполнении захвата видео с экрана?

13
задан 24 December 2013 в 20:56

3 ответа

1. Сначала сделайте вывод RGB без потерь

ffmpeg -y -framerate 25 -video_size 1280x1024 -f x11grab -i :0.0 -c:v libx264rgb \
-crf 0 -preset ultrafast temp.mp4
  • Ввод RGB, поэтому использование кодера libx264rgb позволит избежать потенциально медленного преобразования RGB в YUV, которое может произойти, если вы используете обычный libx264. [ 1126]

  • Здесь используется самая быстрая предустановка кодирования x264: ультрабыстрая.

  • Выход будет без потерь, потому что используется -crf 0.

2. Затем перекодируйте его

Вывод первой команды будет огромным, и большинство тупых игроков не смогут обработать RGB H.264, поэтому вы можете перекодировать его:

ffmpeg -i temp.mp4 -c:v libx264 -crf 23 -preset medium -vf format=yuv420p out.mp4
  • Вы можете поэкспериментировать со значением -crf для контроля качества продукции. Субъективно вменяемый диапазон составляет 18-28, где 18 визуально без потерь или почти так. По умолчанию установлено значение 23.

  • Используйте самые медленные пресеты, на которые у вас есть терпение: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow , По умолчанию установлено значение medium.

  • Я добавил -vf format=yuv420p, чтобы вывод работал с такими тупыми плеерами, как QuickTime и Windows Media Player. Вы можете пропустить это, если загружаете его на YouTube или воспроизводите только на VLC, mpv, MPlayer или любом другом проигрывателе на основе FFmpeg.

Также см.

0
ответ дан 24 December 2013 в 20:56

Лучше сконцентрироваться на использовании различных опций ffmpeg, которые позволят достичь того же результата, при этом используя меньше ресурсов. Тем не менее, есть способы использовать меньше ресурсов, если вам действительно нужно выполнить конкретную задачу с помощью ffmpeg, и он использует слишком много ресурсов.

Вы можете уменьшить приоритет процесса ЦП ffmpeg:

  • Метод терминала: Используйте команду nice, чтобы изменить приоритет процесса: nice -n 8 ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov , В Linux номер приоритета (формат команды nice равен nice -n <priority> <command>) находится в диапазоне от -20 до 20. Чем больше целое число, тем ниже приоритет; нейтральное значение равно 0. Если вы используете команду, которую я дал вам, и установите ее на 8, ЦП даст процессу меньше времени, что выглядит как «энергопотребление». Если это число слишком велико или два низко, вы можете изменить его.
  • Метод графического интерфейса: Это не рекомендуется, потому что дает вам меньше контроля над точным числом и не вступает в силу, как только начинается процесс. Однако это более приемлемо. При работающем ffmpeg откройте системный монитор. Прокрутите вниз до процесса с именем ffmpeg, щелкните его левой кнопкой мыши, выберите его правой кнопкой мыши и установите приоритет «Низкий» или «Очень низкий».

Если вы тоже беспокоитесь об использовании памяти, знают, что невозможно указать процессу, чтобы он занимал только столько памяти и продолжал работать. Ядро автоматически контролирует выделение памяти для процессов. С помощью сценария timeout существует способ кэширования процессов, так что когда процесс и любые дочерние процессы занимают слишком много памяти (установленный вами предел), они благополучно завершаются и уведомление отображается. Однако, если процессу дается только столько памяти (скажем, ядром), и он запрашивает больше памяти, чем не может иметь, он падает.

Некоторые полезные сведения о:

Используя знания Cgroups, вы можете делать много забавных вещей, таких как управление swappiness процесса.

0
ответ дан 24 December 2013 в 20:56

-re (вход) Чтение ввода с собственной частотой кадров. В основном используется для имитации устройства захвата или живого потока ввода (например, при чтении из файла). Не следует использовать с реальными устройствами захвата или живыми входными потоками (где это может привести к потере пакетов). По умолчанию ffmpeg пытается прочитать входные данные как можно быстрее. Эта опция будет замедлять чтение входных данных до исходной частоты кадров входных данных. Это полезно для вывода в реальном времени (например, прямой эфир).

0
ответ дан 24 December 2013 в 20:56

Другие вопросы по тегам:

Похожие вопросы: