来自 RTSP 流信息的 FPS 与实际帧率不匹配

问题描述

我有一个来自 IP 摄像机的 25FPS RTSP 流。我可以成功显示视频流。但是在使用 ffmpeg(实际上是 ffprobe)分析流时,我观察到每秒帧数较少:

$ ffprobe -rtsp_transport tcp -i rtsp://camera_ip:554/stream -select_streams v:0 -show_frames -show_entries frame=coded_picture_number,pkt_pts_time -of csv=p=0
Stream #0:0: Video: h264 (Main),yuvj420p(pc,bt709,progressive),640x480,25 fps,25 tbr,90k tbn,50 tbc
0.400000,0
0.080000,1
0.120000,2
0.200000,3
0.240000,4
0.320000,5
0.360000,6
0.440000,7
0.480000,8
0.560000,9
0.600000,10
0.680000,11
0.720000,12
0.800000,13
0.840000,14
0.920000,15
0.960000,16
1.040000,17
1.080000,18
1.160000,19
1.200000,20
1.280000,21
1.320000,22
1.400000,23
1.440000,24
1.520000,25
1.560000,26
1.640000,27
1.680000,28
1.760000,29
1.800000,30
1.880000,31
1.920000,32
2.000000,33

我们可以清楚地看到一些帧之间的 80 毫秒间隔,从而产生了大约 16 帧的流。

我观察到 GStreamer 存在相同的帧率问题(rtpjitterbuffer 中的打印信息表明帧间隙有时为 80 毫秒,有时为 40 毫秒)。但奇怪的是,我在 HDMI-RJ45 解码器上遇到了同样的问题,我怀疑同样的问题来自 2 个不同的设备。 我没有使用 -loglevel 调试或跟踪获得更多信息。 有人知道流中出了什么问题吗?

(我使用了 ffprobe 4.2.3 和最后一个“2021-05-09-git-8649f5dca6-full_build-www.gyan.dev”,结果相同,而 GStreamer 1.16.2 使用了“urisourcebin !h264depay”这样的管道!h264parse ! fakesink")

编辑:相机跳帧是由激活选项中的第三个流引起的。我发现它每秒钟跳过完全相同的帧真的很奇怪。但是,我仍然没有找到我的 RTSP 编码器降频的原因。 无论如何,这实际上与硬件有关,与软件无关。

解决方法

相机,尤其是便宜的相机,有时会在无法跟上编码的情况下跳帧。相机,而不是 GStreamer、ffmpeg 或其他软件,负责跳帧。这或多或少是正常的。