Ffmpeg использовать все ядра процессора
but it uses %15-20 of cpu i have to make 16 streams like that in same server but i can't.
cant i make a configuration like just downloading .ts files cloning the m3u8?
3 Answers 3
You can't limit FFMpeg to a percentage of CPU use, but you can set the -threads parameter on your FFMpeg call, if you have 4 cores try set it to -threads 2 that should limit you to around 50% CPU.
Another solution might be to lower the priority on your FFMpeg process, to something lower than your applications.
So you are suggesting that I should lower the priority of it, if my CPU has a single core. Is this really the best way to do this?
@Mert, yes for a single core CPU without hyper threading, lowering the priority would be the way to go. Media encoding is a CPU intensive task, and if you are looking for any kind of scalability you should consider not running running FFMpeg on the same machine as your application, in that case a client/server solution would be something you might want to look into. I hope it answered your question.
It's really not the best answer, since there are codecs (like for example x265 encoding) that will use more CPU power, even with a setting -threads 1. They do not translate the ffmpeg setting into actual number of threads, they just use it as a guideline.
@JesperFyhrKnudsen the solution is to limit the ffmpeg process and all of its threads to a certain processor execution affinity (limiting to some number of cores) (Sysinternals Process Explorer does this), on the OS level. There are tools that can limit execution on OS level too. The "incorrect" was referring to "-threads 2 that should limit you to around 50% CPU". If you try it, you can see that setting will lead to a much higher CPU usage on some codecs than just 2 cores. "threads" argument in ffmpeg does not have literal meaning, it does not strictly limit threads.
I'd like to add, that if you're running multiple instances of FFMpeg, say 4 or more, this is not a viable solution. Limiting affinity to 3 out of 4 CPU cores in task manager will be far more suitable.
3 Answers 3
By default, FFmpeg will try to reencode the input, even if you don't use any encoding related parameters.
If you want to just copy the stream as is, you should try the streamcopy function:
By copying the incoming streams, you can skip the encoding process entirely.
So your command would look like this:
(Not sure if it'll work, though.)
When you need to re-encode the incoming stream, you should consider to add some encoding parameters to the command.
By default, ffmpeg tries to match the source parameters and quality, which not always the most optimal in live applications.
The "veryfast, superfast and ultrafast" h264 presets is a good start to get some performance boost.
You can also fiddle with CRF (Constant Rate Factor) encoding, higher bitrates, etc.
If you're reencoding, you have to define the codec too e.g.: -c:v h264 . Also, cut down the > log part, it prohibits ffmpeg to tell what's wrong.
Although this question is already considered answered, I believe it lacks an answer that doesn't involve tuning the command parameters and yet can be used with other tools or commands and not just FFmpeg.
The CPUlimit tool is designed exactly for this purpose and will effectively work not just for FFmpeg but also for any other CPU intensive process you want to reduce this resource utilization.
The most important argument of CPUlimit is -l , which allows you to specify the CPU percentage the process will be allowed to use (as its top limit).
Please, also observe that this limit depends on the number of CPUs/Cores/Threads the machine has, for example, if the machine has 8 CPUs, CPULimit -l valid values will range from 0 to 800 (0 being useless, of course, and 800 meaning not limiting the process at all as 800% means all the machine processing capacity).
Example for using half the capacity for an 8 CPUs machine:
Hope this helps for this specific question as well as similar needs in the future.
The original CPUlimit project seems to have moved to github and is now being maintained by user denji here. I'm leaving the original link because the new project must be compiled and does not offer a binary download.
Also, regarding the original question, if you're trying to limit a bash script (or anything that forks a child process) make sure to add the option -i or --include-children and specify the location of the script if it's not in PATH.
На данный момент при кодировании используется одно ядро. Как заставить ffmpeg нагружать оба?
смотри в сторону fmpeg-mt
Добавить опцию threads=2
при условии того , что выбранный кодек это поддерживает
emerge ffmpeg-mt profit
mplayer-mt (mplayer + ffpmeg-mt) же
В каком оверлее сие находится?
Добавил - походу libtheora не поддерживает :(
Хм. Странно. ffmpeg-mt нету в репах. Бум собирать.
Люди, вы воще о чем? О_о Человек спрашивает о «кодировании» а не «декодировании», тут ffmpeg-mt никаким боком от обычного ffmpeg не отличается. А ТС рекомендую почитать man, думаю там в зависимости от выбранного кодека возможно указать количество потоков ключом threads.
Кодек какой? -threads 0 может быть?
>О_о Человек спрашивает о "кодировании"
threads=2 относится к кодированию тоже, как x264, так и lavcodec.
threads=2 относится к кодированию тоже, как x264, так и lavcodec.
Звиняй, ты у меня в игноре, и я писал лишь о тех, кто рекомендует ffmpeg-mt, который никак не поможет ТС указать нужную опцию. Хотя в игноре ты не зря, т.к. настолько слеп, что не удосужился прочитать мой пост, и увидеть. внезапно! строчку о тех же threads.
Тебе нравится анальное огораживание и бывшие в употреблении метановые пары?
Я вижу, что в ffmpeg есть опция командной строки -threads . Какое значение по умолчанию для этой опции?
это зависит от используемого кодека, версии ffmpeg и количества ядер вашего процессора. Иногда это просто один поток на ядро. Иногда это сложнее, как:
В libx264 это ядра x 1,5 для потоков кадров и ядра x 1 для потоков срезов.
По состоянию на 2014 год он использует оптимальное количество.
Вы можете проверить это на многоядерном компьютере, изучив загрузку процессора (Linux: top , Windows: диспетчер задач) с различными параметрами ffmpeg:
-threads 0 (оптимальный);
-threads 1 (однопоточная);
-threads 2 (2 потока, например, для Intel Core 2 Duo);
нет (по умолчанию, также оптимально).
Редактирование 2015 года: на 12-ядерном процессоре некоторые команды ffmpeg имеют top Linux, показывающий максимум 200% процессорного времени (только 2 ядра), независимо от того, какое число задано для -threads . Таким образом, значение по умолчанию может быть оптимальным в смысле «настолько хорошим, насколько этот двоичный файл ffmpeg может быть получен», но не оптимальным в смысле "полного использования моего процессора Leet".
В 2015 году на Ubuntu 14.04 с ffmpeg 0.8.10-6 она использовала 1 ядро в 4-ядерной системе. htop показал это; использовалось только одно ядро, и я получил скорость преобразования 16 кадров в секунду для видео FullHD.
Использование -threads 4 позволило всем ядрам моего процессора перейти на 100%, и я получил коэффициент конверсии 47 кадров в секунду.
Я использовал следующую команду:
Я играл с конвертированием на CentOS 6.5 VM (Ryzen 1700 8c/16t - vm назначил 12 из 16 ядер). Эксперименты с фильмами 480p показали следующее:
Параметр потока / Коэффициент конверсии (кадров в секунду при 60 секундах)
Интересной частью была загрузка процессора (используя htop для просмотра).
Используя не -threads варианта ликвидируется в 130fps диапазон с нагрузкой разбросано по всем ядрам на низком уровне нагрузки.
Использование 1 потока сделало именно это, загрузил одно ядро на 100%. Использование чего-либо еще привело к другой ситуации с распределенной нагрузкой.
Как вы можете видеть, есть также и точка снижения доходности, поэтому вам придется настроить параметр -threads для вашего конкретного компьютера. Для моей настройки, в частности, использование -threads 6 (на 12-ядерном компьютере) привело к лучшему FPS при преобразовании видео (от h264 до x264 с другим битрейтом для принудительной конвертации), и возврат фактически уменьшился, чем больше потоков я перебросил Это.
Это также могло быть проблемой с памятью - для виртуальной машины было выделено только 1 ГБ. Я могу настроить это и посмотреть, изменит ли это что-нибудь. Тем не менее - это показывает, что использование параметра -threads может повысить производительность, поэтому проведите несколько тестов на вашей конкретной машине на разных уровнях, чтобы найти подходящее место для ваших настроек.
Я вижу, что есть -threads параметр командной строки в ffmpeg. Каково значение этого параметра по умолчанию?
Это зависит от используемого кодека, версии ffmpeg и количества ядер процессора. Иногда это просто один поток на ядро. Иногда это сложнее, как:
с libx264 это ядра x 1.5 для фреймовых потоков и ядра x 1 для слайсовых потоков.
по состоянию на 2014 год, он использует оптимальное число.
вы можете проверить это на многоядерном компьютере, изучив загрузку процессора (Linux: top , Windows: диспетчер задач) с различными параметрами для ffmpeg:
-threads 0 (оптимальный);
-threads 1 (однопоточный);
-threads 2 (2 потока, например, для Intel Core 2 Duo);
none (по умолчанию, также оптимальный.)
2015 редактировать: на 12-ядерном процессоре некоторые команды ffmpeg имеют Linux top показывает не более 200% cpu (только 2 ядра), независимо от того, какое число дано -threads . Таким образом, значение по умолчанию все еще может быть оптимальным в смысле "так хорошо, как этот двоичный файл ffmpeg может получить", но не оптимальным в смысле "полного использования моего процессора leet."
в 2015 году на Ubuntu 14.04 с ffmpeg 0.8.10-6, он использовал 1 ядро на 4 ядра системы. htop показал это; только одно ядро было использовано, и я получил коэффициент конверсии 16 кадров в секунду для видео FullHD.
используя -threads 4 сделал все мои ядра процессора идут на 100%, и я получил коэффициент конверсии 47 кадров в секунду.
я использовал следующую команду:
Если вы включили резьбы, назначили 1,5 х Количество ядер.
играя с некоторыми преобразования в CentOS 6.5 VM (Ryzen 1700 8c / 16t-vm назначен 12 из 16 ядер) делает некоторые стандартные def (480p) фильмы сетчатой следующее:
вариант потока / конверсионный курс (ФПС @ 60 секс) (нет / по умолчанию) / 130fps -потоки 1/70fps -нити 2/120 кадров в секунду -потоки 4/185fps -нити 6/228fps -нити 8/204fps - темы 10 / 181fps
интересная часть была загрузка процессора (с помощью htop, чтобы посмотреть его). Используя вариант никак-резьб заведенный вверх на ряде 130fps с распределением нагрузки по всем ядрам на низком уровне нагрузки. Используя 1 нить сделал именно это, загрузил одно ядро на 100%. Использование чего - либо еще привело к другой ситуации с распределенной нагрузкой.
Как вы можете видеть, есть также Точка уменьшения отдачи, поэтому вам придется настроить опцию-threads для вашей конкретной машины. Для моей установки, в частности, использование-threads 6 (на 12-ядерном компьютере) привело к лучшему FPS при преобразовании видео (от h264 до x264 с другим битрейтом для принудительного преобразования) и возвращает на самом деле уменьшилось больше потоков, которые я бросил в него.
Это тоже могла быть проблема с памятью - виртуальной машине было назначено только 1 ГБ. Я могу настроить это и посмотреть, изменится ли что-нибудь. Тем не менее, это показывает, что использование опции-threads может увеличить производительность, поэтому запустите некоторые тесты на вашей конкретной машине на разных уровнях, чтобы найти свое сладкое место.
I've tried to set Process.PriorityClass to PriorityClass.BelowNormal but this totally blocked the ffmpeg process.
I am sure there is a way to do this since I see a lot of programs that utilize ffmpeg.
Читайте также: