Як мінімізувати використання 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.

Також див


Я знімаю відео з дисплея за замовчуванням (це Xvfb), тому воно може бути будь-яке число
Андрій Боталов

@AndreyBotalov Ви спробували метод без втрат? Це було краще для вас?
логіан

1
В даний час я кличу ffmpegз -preset superfastпараметром (я не пробував -crf). У такому випадку це забирає менше ресурсів і створює відео досить хорошого розміру.
Андрій Боталов

@AndreyBotalov -crf 23використовується за замовчуванням, якщо ви не оголосили значення, але в будь-якому випадку, якщо superfastвам достатньо, можливо, це питання вирішено.
llogan

1
Ви також можете спробувати апаратне кодування через h264_nvenc (nvidia) або h264_qsv (сучасний Intel cpu). Це перекладе тягар кодування з вашого процесора на спеціальне обладнання 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, центральний процесор надасть процесу менше часу, що здається меншою «потужністю». Якщо ця кількість занадто висока або два низьких, звичайно, ви можете змінити її.
  • Метод GUI: Це не рекомендується, оскільки він дає менший контроль над точним числом, і він не набирає чинності, як тільки процес починається. Однак це більш зрозуміло. З ffmpegпрацює, відкрийте системний монітор. Прокрутіть униз до названого процесу ffmpeg, клацніть його лівою кнопкою миші, щоб вибрати, клацніть правою кнопкою миші та встановіть пріоритет на "Низький" або "Дуже низький".

Якщо ви також турбуєтесь про використання пам'яті, знайте, що неможливо сказати, що процес займе стільки пам’яті і все ще працює. Ядро автоматично контролює розподіл пам'яті для процесів. Існує спосіб кегувати процесами за допомогою timeoutсценарію , щоб, коли процес і будь-які дочірні процеси займають занадто багато пам’яті (встановлений вами обмеження), вони безпечно припиняються і відображається повідомлення. Однак, якщо процесу дано лише стільки пам’яті (скажімо, ядро), і він вимагає більше пам’яті, яку він не може мати, він вийде з ладу.

Деякі корисні речі, про які слід знати:

Використовуючи знання Cgroups, ви можете робити дуже багато цікавих речей, як контроль за своєю простотою в процесі.


2
Якщо я правильно розумію, якщо розміщення ffmpeg до черги нижчого пріоритету змусить її створювати відео з лагами, що небажано.
Андрій Боталов

1
Хм ... я нічого не бачу в Інтернеті, що це говорить ... У вас є джерело, яке б це вказувало? (Якщо ні, то це має бути помилка).
Річард

2
Якщо я правильно розумію, нижчий пріоритет означає, що ffmpeg матиме менше процесорного часу, ніж зараз. Але процесор завантажений майже на 100%, тому я думаю, що репріорітизація не допоможе
Андрій Боталов

1
Це розроблено для обмеження використання процесора процесора, тому якщо ваш процесор працює на 100%, це полегшить час роботи з ним.
Річард

4
Я -1 це, бо як би ви не змінили пріоритет, це тільки погіршиться. Якщо встановити нижчий пріоритет, це зменшить час процесора для ffmpeg, що призведе до більше опущених кадрів, або, підвищивши пріоритет, ще більше сповільнить інші процеси в системі. Обидва результати є небажаними.
gertvdijk

0

-re (вхід) Прочитати вхід із частотою кадрів. В основному використовується для імітації пристрою захоплення або прямого вхідного потоку (наприклад, під час читання з файлу). Не слід використовувати з власними пристроями захоплення або потоками вхідного сигналу (де це може призвести до втрати пакету). За замовчуванням ffmpeg намагається прочитати вхід (и) якнайшвидше. Цей параметр призведе до уповільнення зчитування вхідних даних до частоти кадрів вхідних даних. Це корисно для виведення в реальному часі (наприклад, пряма трансляція).


"Не слід використовувати із фактичними пристроями захоплення", такими як x11grab.
логіан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.