ffmpeg 可能随着时间的推移进行下采样,为 RTSP 提供服务吗?

Possible for ffmpeg to downsample over time, serve RTSP?

我想使用 RSTP 网络摄像头,将视频下采样到较低的速率(比如每 5 秒一帧)并将结果作为 RTSP 流提供。 是否可以配置 ffmpeg(或 libffmpeg)来做这样的事情?

是的,我们所要做的就是添加 -r 0.2 参数和 re-encode 视频。

还建议添加 -tune zerolatency-g 1 以确保每一帧都是关键帧(在视频延迟相关的情况下需要)。


示例:
从本地主机接收 RTSP 流,并以 0.2fps 的速度流式传输(到具有不同端口的本地主机):

ffmpeg -rtsp_flags listen -rtsp_transport tcp -stimeout 1000000 -i rtsp://127.0.0.1:10000/live.stream -r 0.2 -vcodec libx264 -tune zerolatency -pix_fmt yuv420p -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:20000/live.stream

测试:
为了进行测试,我用 FFmpeg 模拟了 RTSP 摄像头(以 25fps 的速度流式传输合成视频)。
RTSP 流由另一个 FFmpeg 进程捕获,该进程将速率降低到 0.2fps。
0.2fps 的视频是使用 FFprobe 捕获和显示的。

测试作为批处理文件实现:

::Play the video for testing
start ffplay -rtsp_flags listen -rtsp_transport tcp -flags low_delay -vf setpts=0 -listen_timeout 1000000 rtsp://127.0.0.1:20000/live.stream

::Wait 5 seconds
ping 127.0.0.1 -n 5 > nul

::Capture the RTSP camera at 25fps, convert to 0.2fps (with re-encoding)
start ffmpeg -rtsp_flags listen -rtsp_transport tcp -stimeout 1000000 -i rtsp://127.0.0.1:10000/live.stream -r 0.2 -vcodec libx264 -tune zerolatency -pix_fmt yuv420p -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:20000/live.stream

::Wait 5 seconds
ping 127.0.0.1 -n 5 > nul

::Simulate an RTSP camera at 25fps
ffmpeg -re -f lavfi -i testsrc=size=192x108:rate=25 -vcodec libx264 -pix_fmt yuv420p -g 30 -rtsp_transport tcp -f rtsp -muxdelay 0.1 rtsp://127.0.0.1:10000/live.stream

一开始很尴尬,几帧后就稳定了。
(我们可以使用select过滤器来解决它)。

样本帧: