我正在尝试从实时流中提取单个帧,每 5 秒不使用 -vf 选项。我使用的是 Raspberry Pi,所以 CPU 很重要。
基本上,我正在从实时源流式传输 UDP 流,它使用很少的 CPU,但我想每 5 秒拍摄一次快照。
这有效,但只产生一个图像。
-c copy -f mpegts udp://239.0.0.1:1234 -vcodec copy -vframes 1 out.png
这可行,但会使用所有 CPU 和更多。
-c copy -f mpegts udp://239.0.0.1:1234 -vcodec copy -vf fps=1 out%d.png
任何人都知道我是否可以在不使用过滤器的情况下做到这一点?我的另一个解决方案是运行第二个ffmpeg并连接到UDP流,这确实很麻烦。
最佳答案
由于您的关键帧是每秒一个,并且您希望每 5 秒一帧,因此需要进行一些过滤,除非您可以删除每 5 个创建的图像中的 4 个。
这是每 5 秒创建一帧的模板,假设关键帧间隔为 1/s。
ffmpeg -i ... -c copy -map 0 -f tee "[f=mpegts]udp://239.0.0.1:1234|[f=mpegts]pipe:" | ffmpeg -f mpegts -skip_frame nokey -i pipe: -vf select='not(mod(n,5))' -vsync 0 out%d.png
这是将每个关键帧作为图像转储,然后删除不需要的关键帧:
ffmpeg -i ... -c copy -map 0 -f tee "[f=mpegts]udp://239.0.0.1:1234|[f=mpegts]pipe:" | ffmpeg -f mpegts -skip_frame nokey -i pipe: -vsync 0 out%d.png
管道语法
pipe:
在 Windows 上工作。相信它也应该在 linux 上工作。
关于FFMPEG:每 5 秒从实时流中提取一帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42612315/