我需要在不耗尽我的 CPU(在 Linux 上)的情况下降低后台某些 H.264 视频的帧速率。不知何故-threads 1
根本没有效果:
ffmpeg -threads 1 -i 50fps.mp4 -filter:v fps=30 30fps.mp4
流信息:
Stream #0:0(und): Video: h264 (avc1 / 0x31637661), yuv420p(tv, bt470bg, progressive)
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D)
所有核心仍然被最大化。我怎样才能将其限制为只有一个核心?H.265 对此 ( pools=none
) 有一个特定于编码器的选项,我可以在这里使用类似的东西吗?
你可以这样做
taskset
:运行您的 ffmpeg 进程,仅限于第一个 CPU 内核(从 0 开始计数)。或者例如,在第一个和第三个核心上运行它:
视频编码线程由 output 设置
-threads
。所以,
是为了防止其他软件因为 ffmpeg 在后台占用 CPU 而无法正常工作吗?
在这种情况下,我建议以更高的友好度运行它:
这将允许调度程序最小化 ffmpeg 的优先级并在任何其他进程需要 CPU 时立即抢占它,并且仍然允许您尽可能快地利用所有内核进行编码。
如果您使用的是使用 systemd 的 Linux 发行版,那么您可以使用一个名为systemd-run的实用程序来进行资源控制。对于您的情况,将是这样的:
对于
AllowedCPUs
,您可以提及要限制命令执行的逻辑核心的索引。第一个逻辑核心的索引为 0,第二个逻辑核心为 1,依此类推。对于
CPUQuota
,100% 等于一个逻辑核心的最大可用 CPU 时间。200% 将是两个逻辑核心,依此类推。示例 A:
示例 B:
建议阅读:systemd-run和systemd.resource-control手册。
我经常使用 cpulimit 通过每晚 LARGE 压缩备份来限制我机器上的整体负担,例如:
我想知道 cpulimit 和 taskset 之间有什么区别,我从这个站点收集到cpulimit 是一个节流阀,而 taskset 建立了关联。事实上,如果我起得够晚,我实际上可以听到我的冷却风扇上下移动,因此 CPU 内核上的总体平均负载为 30%(在上面的示例中)。
出于与提问者相同的原因,我也使用它来限制 ffmpeg,尽管我通常是“动手”做的。