FFmpeg从RTSP按1FPS推流帧率过高问题求助
解决FFmpeg推流RTSP源时帧率高于设定值的问题
我来帮你排查并解决这个问题——你用ffmpeg.exe -i rtsp:/XXXXX -q:v 1 -vf fps=fps=1 -f mpegts udp://Y.Y.Y.Y:ZZ命令推流,结果接收端帧率超过1FPS,这个情况通常和FFmpeg的输入流缓存、编码器参数或者帧率过滤的时机有关,下面是具体的分析和修复方案:
可能的原因
- RTSP输入源本身帧率较高,FFmpeg默认缓存机制会一次性读取多帧,导致
fps滤镜没能完全生效 - MPEG-TS封装格式的特性,可能在推流时携带额外帧信息,或者编码器未严格遵循设定帧率
修复方案
方案1:调整滤镜顺序+强制编码器帧率
把帧率滤镜放在更靠前的位置,同时强制编码器输出1FPS,双重限制帧率:
ffmpeg.exe -i rtsp:/XXXXX -vf fps=fps=1 -r 1 -q:v 1 -f mpegts udp://Y.Y.Y.Y:ZZ
这里的-r 1是强制编码器输出的帧率,和fps滤镜配合,能更严格地控制输出帧数量。
方案2:添加输入缓存限制
限制RTSP输入的缓存大小,避免FFmpeg一次性读取过多帧,让滤镜实时处理:
ffmpeg.exe -rtsp_transport tcp -i rtsp:/XXXXX -vf fps=fps=1 -r 1 -q:v 1 -f mpegts udp://Y.Y.Y.Y:ZZ
-rtsp_transport tcp改用TCP传输RTSP,比UDP更稳定,还能间接限制输入帧缓存量;如果仍有问题,可再加-max_delay 500000(单位微秒,即500ms)限制最大缓存延迟。
方案3:非图片格式保存帧再推流(你提到的替代方案)
如果上面的方法都不生效,可以先把1FPS的帧保存为视频文件,再推流这个文件,确保帧率严格为1FPS:
# 第一步:捕获1FPS帧保存为MP4 ffmpeg.exe -i rtsp:/XXXXX -vf fps=fps=1 -r 1 -q:v 1 -c:v libx264 -preset ultrafast temp.mp4 # 第二步:按原始帧率推流文件到UDP ffmpeg.exe -re -i temp.mp4 -f mpegts udp://Y.Y.Y.Y:ZZ
-re参数会让FFmpeg以文件原始帧率(1FPS)推流,避免快速推送所有帧。
验证方法
你可以在接收端用FFmpeg查看实际帧率:
ffmpeg.exe -i udp://Y.Y.Y.Y:ZZ -f null -
查看输出日志里的fps数值,确认是否稳定在1FPS左右。
内容的提问来源于stack exchange,提问作者Robob




