提问者:小点点

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


我正在尝试渲染视频。但我想以恒定速度渲染它。示例:

ffmpeg-stream_loop-1113856_video_0.ts-c: v复制-c: a aac-bufsize3600k-maxrate1800k-rtbufsize15M-元数据注释="屏幕113856"-预设超快-g 50-r 4-sc_threshold0-crf 0-线程1out.mp4

这个ffmpeg可以很好地呈现视频,像这样输出

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

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

有一个选项可以使用cpulimit

cpulimited-l 20 ffmpeg...

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


共1个答案

匿名用户

下面是一个基于过滤器的粗糙黑客,用来模拟这种行为。要使用它,至少必须对一个音频/视频流进行编码。

在您的命令中,由于只有音频被编码,我们将加入该流。如果你想将这种攻击集成到一个已有的具有多个输出的filtergraph中,那么把它插入到一个可能最快处理其输出的filterchain的末尾,以减少缓冲。

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

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

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