我正在尝试渲染视频。但我希望将它渲染为恒定速度。 示例:
ffmpeg -stream_loop -1 -i 113856_video_0.ts -c:v copy -c:aac -bufsize 3600k -maxrate 1800k -rtbufsize 15M -metadata comment =" screen113856" -preset ultrafast -g 50 -r 4 -sc_threshold 0 -crf 0 -threads 1 out.mp4
这个ffmpeg会将视频渲染得很好,就像这样
frame = 77590 fps = 113 q = -1.0 size = 596650kB time = 00:51:43.67 bitrate = 1574.8kbits / s speed = 10.51x
你可以看到速度= 10.51x,速度很快,但它占用了我所有的CPU。如果我使用 ffmpeg -re ,它会渲染为speed = 1x,对CPU有利,但需要时间。我可以将视频渲染为特定速度吗?
可以选择使用cpulimit
cpulimit -l 20 ffmpeg ...
几乎解决了我的情况但是: - 有时它不起作用,ffmpeg仍然需要100%的CPU - 对于每个视频,我必须设置CPU限制数量(-l 20,30)以获得特定速度。我想自动完成。
答案 0 :(得分:3)
这是一个基于过滤器的粗暴黑客来模拟这种行为。要使用它,至少有一个音频/视频流必须进行编码。
在您的命令中,由于仅对音频进行编码,因此我们将共同选择该流。如果您要将此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
FFmpeg提供了一组过滤器:realtime
(用于视频)和arealtime
(用于音频),可将帧的直通限制为实时进一步过滤。在实践中,这意味着具有1秒间隔的时间戳的帧被传送1秒或更多(如果先前的过滤花费更多时间)。所以黑客就是将时间戳折叠到你想要的速度,然后再恢复它们。由于您需要3x,因此时间戳首先降低到1/3,然后在过滤器后恢复。
这只会减慢处理速度,而不是加快速度。