注意:不建议依赖FPS进行实时流媒体传输,因为RTMP/FLV始终使用固定的TBN(时间基准)为1k,这可能会在通过RTMP发布流或录制到TS/MP4等格式时引入偏差。
注意:对于WebRTC,FPS是可变的。请参考
WebRTC是否使用恒定帧率来捕获视频帧或
可变帧率(VFR)以获取更多信息。
该问题与SRS或FPS无关,并且可以使用FFmpeg复制。
- 使用FFmpeg将
doc/source.flv
从25fps转码为15fps,然后通过RTMP协议发布到SRS(15fps)。
- 使用FFmpeg将RTMP(15fps)流录制为
output.mp4
(15fps)。
- 使用VLC播放
output.mp4
(15fps),您会注意到帧率并不完全是15fps。
首先,使用以下配置启动SRS,并确保禁用DVR功能:
listen 1935;
daemon off;
srs_log_tank console;
vhost __defaultVhost__ {
}
运行FFmpeg进行转码并发布到SRS,将帧率改为15。
cd srs/trunk
ffmpeg -re -i doc/source.flv -c:v libx264 -r 15 -c:a copy \
-f flv rtmp://localhost/live/livestream
记录 RTMP 流(以 15 帧每秒的速度)到 output.mp4。在 FFmpeg 日志中,你会看到帧率是 15。
ffmpeg -f flv -i rtmp://localhost/live/livestream -c copy -y output.mp4
使用VLC播放
output.mp4
(15fps),然后打开
窗口 -> 媒体信息
。你会发现FPS在14.8fps左右波动,而不是完全准确的15fps。
这种偏差是因为RTMP/FLV的TBN固定为1000(1k tbn,每帧大约为66.67毫秒)。当将MP4发布到RTMP流时引入了这种偏差。这不是由DVR引起的,而是由RTMP/FLV TBN引起的。
注意:对于SRS来说,使用固定的1k TBN可能不是最佳选择,因为它对于MP4的持续时间并不理想。问题srs#2790已重新打开。
总之,帧率/FPS不是一个固定值,它只是流的指示器。播放器依靠DTS/PTS来确定何时以及如何渲染图像。