boy*_*ndi 4 video performance ffmpeg render
我正在尝试渲染视频。但我想将其渲染为恒定速度。例子 :
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_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) 以获得特定速度。我想自动完成。
这是一个基于过滤器的粗略的 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,然后在过滤器后恢复。
这只能减慢处理速度,不能加快处理速度。
| 归档时间: |
|
| 查看次数: |
4734 次 |
| 最近记录: |