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
过滤器来解决它)。
样本帧:
我想使用 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
过滤器来解决它)。
样本帧: