ffmpeg:编码 h264 时限制为单 CPU 核心

ffmpeg:编码 h264 时限制为单 CPU 核心

我需要在不占用大量 CPU 的情况下在后台降低某些 H.264 视频的帧速率(在 Linux 上)。不知何故,根本-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),我在这里可以使用类似的选项吗?

答案1

您可以使用以下方式执行此操作taskset

taskset -c 0 ffmpeg ...

将 ffmpeg 进程限制在第一个 CPU 核心(从 0 开始计数)上运行。或者例如,在第 1 个和第 3 个核心上运行它:

taskset -c 0,2 ffmpeg ...

答案2

视频编码线程由输出设置-threads

所以,

ffmpeg -i 50fps.mp4 -filter:v fps=30 -threads:v 1 30fps.mp4

答案3

目的是为了防止由于 ffmpeg 在后台占用 CPU 而导致其他软件运行不佳吗?

在这种情况下,我建议以更高的优先级来运行它:

nice -n 19 ffmpeg -i 50fps.mp4 -filter:v fps=30 30fps.mp4

这将允许调度程序最小化 ffmpeg 的优先级,并在任何其他进程需要 CPU 时立即抢占它,同时仍然允许您尽快利用所有核心进行编码。

答案4

如果你正在使用使用 systemd 的 Linux 发行版,那么你可以使用名为systemd 运行用于资源控制。对于你的情况,应该是这样的:

sudo systemd-run --scope -p AllowedCPUs=VALUE CMD
sudo systemd-run --scope -p CPUQuota=VALUE% CMD

对于AllowedCPUs,您可以提及要限制命令执行的逻辑核心的索引。索引为 0 表示第一个逻辑核心,1 表示第二个逻辑核心,依此类推。

对于CPUQuota,100% 等于一个逻辑核心的最大限度可用的 CPU 时间。200% 代表两个逻辑核心,依此类推。

示例 A:

# 我的压力命令想要使用我机器的所有 8 个逻辑核心,
# 但 systemd 会将其限制为允许的逻辑核心 0 和 4。
# 我选择 0 和 4 是因为它们属于同一个物理核心。

sudo systemd-run --scope -p AllowedCPUs=0,4 stress -c 8

示例 B:

# 在这里,我的压力命令尽管占用了所有 CPU,但只会
仅获取一个逻辑核心的 100% *可用* 时间。

sudo systemd-run --scope CPUQuota=100% 压力 -c 8

建议阅读:systemd 运行systemd.资源控制

相关内容