Загрузка данных


~ 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;                                                                                                                                                 <....