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

13

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

В настоящее время я вызываю это с:

ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov

Когда я записываю видео примерно с 5 сеансов Xvfb, загрузка моего процессора очень высока, и из-за этого возникают задержки. Также использование памяти составляет около 300 МБ для каждого из процессов ffmpeg.

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

Андрей Боталов
источник

Ответы:

17

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.

  • При этом используется самый быстрый пресет кодирования 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.

Также см

llogan
источник
Я снимаю видео с дисплея не по умолчанию (это Xvfb), поэтому оно может быть любым числом
Андрей Боталов
@AndreyBotalov Вы пробовали метод без потерь? Это работало лучше для вас?
Llogan
1
В настоящее время я вызываю ffmpegс -preset superfastпараметром (я не пробовал -crf). В этом случае он потребляет меньше ресурсов и производит видео достаточно хорошего размера.
Андрей Боталов
@AndreyBotalov -crf 23используется по умолчанию, если вы не объявляете значение, но в любом случае, если superfastвам этого достаточно, возможно, проблема решена.
Llogan
1
Вы также можете попробовать аппаратное кодирование через h264_nvenc (nvidia) или h264_qsv (современный процессор Intel). Это сместит бремя кодирования с вашего процессора на выделенное оборудование h264.
Кенн
4

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

Ричард
источник
2
Если я правильно понимаю, если поместить ffmpeg в очередь с более низким приоритетом, то получится видео с задержками, что нежелательно.
Андрей Боталов
1
Хм ... Я ничего не вижу в Интернете, говоря это ... У вас есть источник, который указывает на это? (Если нет, то это должно быть ошибкой).
Ричард
2
Если я правильно понимаю, низкий приоритет означает, что у ffmpeg будет меньше процессорного времени, чем сейчас. Но процессор загружен почти на 100%, так что я думаю, что переориторизация не поможет
Андрей Боталов
1
Это разработано, чтобы ограничить использование процессора процессом, поэтому, если ваш процессор работает на 100%, ему будет легче справиться с этим.
Ричард
4
Я -1 это, потому что, как бы вы ни меняли приоритет, это только ухудшит его. Установка более низкого приоритета уменьшит время процессора для ffmpeg, что приведет к большему количеству пропущенных кадров, или, повысив приоритет, замедлит другие процессы в системе еще больше. Оба результата нежелательны.
gertvdijk
0

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

劉 大為
источник
«Не следует использовать с реальными устройствами захвата», такими как x11grab.
Llogan