保持 ffmpeg 渲染为恒定速度(3x)
Keep ffmpeg render as constant speed ( 3x )
我正在尝试渲染视频。但我想将其渲染为恒定速度。
示例:
ffmpeg -stream_loop -1 -i 113856_video_0.ts -c:v copy -c:a 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
你可以看到 speed=10.51x ,速度很快,但它占用了我所有的 CPU。如果我使用 ffmpeg -re ,它呈现为 speed=1x ,对 CPU 有好处,但需要时间。我可以将视频渲染为特定速度吗?
有一个选项可以使用 cpulimit
cpulimit -l 20 ffmpeg ...
几乎解决了我的问题,但是:
- 有时它不起作用,ffmpeg 仍然占用 100% CPU
- 对于每个视频,我必须设置数量 CPU 限制,(-l 20, 30) 以获得特定速度。我想自动完成。
这里有一个基于过滤器的粗略技巧来模拟这种行为。要使用它,至少一个 audio/video 流必须经过编码。
在您的命令中,由于仅对音频进行编码,我们将选择该流。如果您打算将此 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 秒或更长时间传送(如果之前的过滤需要更多时间)。所以 hack 是将时间戳折叠到您想要的速度,然后再恢复它们。因为你想要3x,所以时间戳先减少到1/3,然后过滤后恢复。
这只能减慢处理速度,而不能加快处理速度。
我正在尝试渲染视频。但我想将其渲染为恒定速度。 示例:
ffmpeg -stream_loop -1 -i 113856_video_0.ts -c:v copy -c:a 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
你可以看到 speed=10.51x ,速度很快,但它占用了我所有的 CPU。如果我使用 ffmpeg -re ,它呈现为 speed=1x ,对 CPU 有好处,但需要时间。我可以将视频渲染为特定速度吗?
有一个选项可以使用 cpulimit
cpulimit -l 20 ffmpeg ...
几乎解决了我的问题,但是: - 有时它不起作用,ffmpeg 仍然占用 100% CPU - 对于每个视频,我必须设置数量 CPU 限制,(-l 20, 30) 以获得特定速度。我想自动完成。
这里有一个基于过滤器的粗略技巧来模拟这种行为。要使用它,至少一个 audio/video 流必须经过编码。
在您的命令中,由于仅对音频进行编码,我们将选择该流。如果您打算将此 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 秒或更长时间传送(如果之前的过滤需要更多时间)。所以 hack 是将时间戳折叠到您想要的速度,然后再恢复它们。因为你想要3x,所以时间戳先减少到1/3,然后过滤后恢复。
这只能减慢处理速度,而不能加快处理速度。