保持 ffmpeg 渲染为恒定速度(3x)

boy*_*ndi 4 video performance ffmpeg render

我正在尝试渲染视频。但我想将其渲染为恒定速度。例子 :

ffmpeg -stream_loop -1 -i 113856_video_0.ts -c:v copy -c:a aac -bufsize 360​​0k -maxrate 1800k -rtbufsize 15M -metadata comment="screen113856" -preset ultrafast -g 50 -r 4 -sc_th 0 -threads 1 out.mp4

这个 ffmpeg 可以很好地渲染视频,像这样输出

帧=77590 fps=113 q=-1.0 大小= 596650kB 时间=00:51:43.67 比特率=1574.8kbits/s 速度=10.51x

你可以看到 speed=10.51x ,它很快,但它占用了我所有的 CPU。如果我使用 ffmpeg -re,它呈现为 speed=1x ,对 CPU 有好处,但需要时间。我可以以特定速度渲染视频吗?

有一个选项可以使用 cpulimit

cpulimit -l 20 ffmpeg ...

几乎解决了我的情况,但是: - 有时它不起作用,ffmpeg 仍然占用 100% CPU - 对于每个视频,我必须设置 CPU 数量限制 (-l 20, 30) 以获得特定速度。我想自动完成。

Gya*_*yan 5

这是一个基于过滤器的粗略的 hack 来模拟这种行为。要使用它,至少一个音频/视频流必须经过编码。

在您的命令中,由于只对音频进行编码,我们将选择该流。如果您打算将此 hack 集成到具有多个输出的现有过滤器图中,请将其插入到可能最快处理其输出的过滤器链的末尾,以减少缓冲。

ffmpeg -stream_loop -1 -i 113856_video_0.ts \
-af asetpts=PTS/3,arealtime,asetpts=PTS*3 
-c:v copy -c:a aac -metadata comment="screen113856" -threads 1 out.mp4
Run Code Online (Sandbox Code Playgroud)

FFmpeg 提供了一组过滤器:(realtime用于视频)和arealtime(用于音频)限制帧通过实时进一步过滤器。实际上,这意味着时间戳间隔为 1 秒的帧的传送间隔为 1 秒或更长时间(如果先前的过滤需要更多时间)。所以黑客是将时间戳折叠到你想要的速度,然后再恢复它们。由于您想要 3x,时间戳首先减少到 1/3,然后在过滤器后恢复。

这只能减慢处理速度,不能加快处理速度。