录制视频时如何通过ffmpeg最小化CPU /内存的使用


13

我使用FFmpeg从Xvfb显示器进行视频截屏。

目前,我通过以下方式调用它:

ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov

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

进行视频屏幕捕获时,应使用ffmpeg的哪些参数来最大程度地减少计算机资源的使用(尤其是CPU和内存)?

Answers:


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将避免使用纯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
  • 您可以尝试使用该-crf值来控制输出质量。主观上合理的范围是18-28,其中18在视觉上无损或接近无损。默认值为23。

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

  • 我添加-vf format=yuv420p以确保输出可与诸如QuickTime和Windows Media Player之类的傻瓜播放器一起使用。如果将其上传到YouTube或仅在VLC,mpv,MPlayer或任何其他基于FFmpeg的播放器上播放,则可以忽略此设置。

另见


从非默认显示(它的Xvfb来)我拍摄的视频,因此它可以是任何数字
安德烈Botalov

@AndreyBotalov您尝试了无损方法吗?它对您来说效果更好吗?
llogan

1
目前,我ffmpeg使用-preset superfast参数调用(我还没有尝试过-crf)。在这种情况下,它占用的资源较少,并且可以产生足够大的视频。
Andrei Botalov

-crf 23如果您未声明值,则默认情况下使用@AndreyBotalov ,但是无论如何如果superfast足够的话就可以解决问题。
llogan

1
您也可以尝试通过h264_nvenc(nvidia)或h264_qsv(现代intel cpu)进行硬件编码。这会将编码负担从CPU转移到专用的h264硬件。
肯(Kenn)

4

最好专注于使用不同的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,左键单击以选择它,右键单击它,并将优先级设置为“低”或“非常低”。

如果您也担心内存使用情况,请知道不可能告诉一个进程只占用这么多的内存并且仍在运行。内核自动控制进程的内存分配。使用timeout脚本可以用一种笼罩进程的方式,以便当进程和任何子进程占用太多内存(由您设置的限制)时,它们会安全终止,并显示通知。但是,如果一个进程仅被提供了如此多的内存(例如由内核提供),并且它请求了更多它无法拥有的内存,则它将崩溃。

一些有用的事情要知道:

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


2
如果我正确理解,将ffmpeg放在较低优先级的队列中将使它产生的视频滞后是不希望的。
Andrei Botalov

1
嗯...我在网上看不到有什么话说...您是否有表明这一点的消息来源?(如果没有,那应该是一个错误)。
理查德

2
如果我正确理解较低的优先级,则意味着ffmpeg的处理器时间将比现在少。但是处理器的负载几乎达到了100%,因此我认为重新安排优先级无济于事
Andrei Botalov 2013年

1
这是为了限制进程的CPU使用率,因此,如果您的CPU以100%的速度运行,则处理它的时间会更短。
理查德

4
我将此设为-1,因为无论您如何更改优先级,都只会使优先级恶化。设置较低的优先级将减少ffmpeg的CPU时间,从而导致更多丢帧,或者通过提高优先级,将进一步减慢系统上的其他进程。两种结果都是不希望的。
gertvdijk 2013年

0

-re(输入)以原始帧速率读取输入。主要用于模拟抓取设备或实时输入流(例如,从文件读取时)。不应与实际的抓取设备或实时输入流一起使用(这可能会导致数据包丢失)。默认情况下,ffmpeg尝试尽可能快地读取输入。此选项会将输入的读取速度减慢到输入的原始帧速率。对于实时输出(例如实时流)很有用。


“不应与实际的抓取设备一起使用”,例如x11grab。
洛根
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.