~ RTSP_URL='rtsp://root:123456@172.17.1.96:554/ch0' EXPECTED_FPS=30 GOP=30 ffprobe -rtsp_transport tcp -v error -select_streams v:0 -show_frames -show_entries frame=key_frame,pict_type -of csv=p=0 "$RTSP_URL" 2>/dev/null | perl -MTime::HiRes=time -ne '
BEGIN {
$expected_fps = $ENV{"EXPECTED_FPS"} || 30;
$gop = $ENV{"GOP"} || 30;
$expected_key_interval = $gop / $expected_fps;
$warn_key_delay = $expected_key_interval * 1.5;
$bad_key_delay = $expected_key_interval * 2.0;
$start_time = time();
$last_report_time = $start_time;
$last_key_time = 0;
$frames = 0;
$frames_window = 0;
$green = "\033[32m";
$yellow = "\033[33m";
$red = "\033[31m";
$reset = "\033[0m";
printf "Expected FPS: %.2f | GOP: %d | Expected keyframe interval: %.3fs\n", $expected_fps, $gop, $expected_key_interval;
printf "Warn keyframe > %.3fs | Critical > %.3fs\n\n", $warn_key_delay, $bad_key_delay;
}
chomp;
@f = split /,/;
$key = $f[0];
$pict = $f[1];
$now = time();
$frames++;
$frames_window++;
if (($now - $last_report_time) >= 1.0) {
$elapsed = $now - $start_time;
$window_elapsed = $now - $last_report_time;
$fps_total = $frames / $elapsed;
$fps_window = $frames_window / $window_elapsed;
$speed = $fps_total / $expected_fps;
$color = $green;
$color = $yellow if $fps_window < $expected_fps * 0.90;
$color = $red if $fps_window < $expected_fps * 0.75;
printf "%sFPS now: %.2f | FPS avg: %.2f | speed: %.3fx | frames: %d | elapsed: %.1fs%s\n",
$color, $fps_window, $fps_total, $speed, $frames, $elapsed, $reset;
$frames_window = 0;
$last_report_time = $now; <....