如何在录制视频时最大限度地减少 ffmpeg 对 CPU/内存的使用

And*_*lov 16 command-line video ffmpeg

我使用 FFmpeg 从 Xvfb 显示器制作视频屏幕截图。

目前我调用它:

ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov
Run Code Online (Sandbox Code Playgroud)

当我从大约 5 个 Xvfb 会话中录制视频时,我的 CPU 使用率非常高,因此会出现延迟。此外,每个 ffmpeg 进程的内存使用量约为 300 MB。

在制作视频屏幕截图时,我应该使用 ffmpeg 的哪些参数来最小化计算机资源的使用(特别是 CPU 和内存)?

llo*_*gan 18

1.先做无损RGB输出

ffmpeg -y -framerate 25 -video_size 1280x1024 -f x11grab -i :0.0 -c:v libx264rgb \
-crf 0 -preset ultrafast temp.mp4
Run Code Online (Sandbox Code Playgroud)
  • 输入是 RGB,因此使用编码器 libx264rgb 将避免使用普通 libx264 时可能发生的 RGB 到 YUV 的潜在缓慢转换。

  • 这使用最快的 x264 编码预设:超快。

  • 输出将是无损的,因为-crf 0被使用。

2.然后重新编码

第一个命令的输出会很大,而且大多数愚蠢的玩家无法处理 RGB H.264,因此您可以重新编码它:

ffmpeg -i temp.mp4 -c:v libx264 -crf 23 -preset medium -vf format=yuv420p out.mp4
Run Code Online (Sandbox Code Playgroud)
  • 您可以尝试使用该-crf值来控制输出质量。主观上理智的范围是 18-28,其中 18 是视觉无损或几乎无损。默认值为 23。

  • 使用您有耐心的最慢预设:ultrafastsuperfastveryfastfasterfastmediumslowslowerveryslow。默认为medium

  • 我添加-vf format=yuv420p以确保输出适用于 QuickTime 和 Windows Media Player 等愚蠢的播放器。如果您将其上传到 YouTube 或仅在 VLC、mpv、MPlayer 或任何其他基于 FFmpeg 的播放器上播放,则可以省略此设置。

另见


Ric*_*ard 5

最好集中精力使用不同的 ffmpeg 选项,以使用更少的资源实现相同的结果。也就是说,如果您确实需要使用 ffmpeg 完成特定的事情并且它使用了太多资源,则可以通过多种方法来使用更少的资源。

ffmpeg您可以降低CPU 进程的优先级:

  • 终端方法:使用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,CPU会给进程更少的时间,这看起来像是更少的“权力”。如果这个数字太高或者太低了两点,当然你可以改变它。
  • GUI 方法:不建议这样做,因为它使您对确切数字的控制较少,并且不会在进程开始后立即生效。然而,它更容易理解。运行时ffmpeg,打开系统监视器。向下滚动到名为 的进程ffmpeg,左键单击它进行选择,右键单击它,并将优先级设置为“低”或“非常低”。

如果您也担心内存使用情况,请知道不可能告诉进程只占用这么多内存并仍然运行。内核自动控制进程的内存分配。有一种方法可以使用timeoutscript来限制进程,以便当进程和任何子进程占用过多内存(由您设置的限制)时,它们会被安全终止并显示通知。然而,如果一个进程只获得了这么多内存(比如由内核提供),并且它请求了更多它无法拥有的内存,那么它就会崩溃。

一些需要了解的有用的事情:

利用 Cgroup 的知识,您可以做很多有趣的事情,例如控制进程的交换性。

  • 我把这个设置为-1,因为无论你如何改变优先级,只会让情况变得更糟。设置较低的优先级将降低 ffmpeg 的 CPU 时间,从而导致更多的丢帧,或者通过提高优先级,它会进一步减慢系统上的其他进程。这两种结果都是不希望的。 (5认同)
  • 如果我理解正确,将 ffmpeg 放入较低优先级队列将使其生成具有延迟的视频,这是不希望的。 (3认同)
  • 如果我理解正确的话,较低的优先级意味着 ffmpeg 的处理器时间将比现在少。但处理器几乎已加载 100%,因此我认为重新确定优先级不会有帮助 (3认同)