You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动