{
  "задача": "все MP4 из маршруты/медиа → 320x180, 15 к/с, длительность сохраняется",
  "внешние_программы": {
    "ffmpeg": "ffmpeg version 9.0.1 Copyright (c) 2000-2026 the FFmpeg developers",
    "кодек": "libx264 (H.264), pixel format yuv420p"
  },
  "python": "3.14.0",
  "всего_файлов": 3,
  "успешно": 3,
  "с_ошибкой": 0,
  "файлы": [
    {
      "вход": "маршруты/медиа/клип-02.mp4",
      "выход": "результаты/клип-02-320x180-15fps.mp4",
      "параметры": {
        "разрешение": "320x180",
        "кадров_в_секунду": 15,
        "кодек": "libx264",
        "preset": "medium",
        "crf": 18,
        "pix_fmt": "yuv420p",
        "звук": "не переносится"
      },
      "исходник": {
        "длительность_с": 8.0,
        "размер_байт": 475140,
        "разрешение": "640x360",
        "частота_кадров": "25/1",
        "кадров": 200,
        "видеодорожек": 1,
        "аудиодорожек": 0,
        "кодек": "h264",
        "контейнер": "mov,mp4,m4a,3gp,3g2,mj2"
      },
      "результат": {
        "длительность_с": 8.0,
        "размер_байт": 245034,
        "разрешение": "320x180",
        "частота_кадров": "15/1",
        "кадров": 120,
        "видеодорожек": 1,
        "аудиодорожек": 0,
        "кодек": "h264",
        "контейнер": "mov,mp4,m4a,3gp,3g2,mj2"
      },
      "статус": "ок",
      "проверки": [
        {
          "проверка": "разрешение",
          "факт": "320x180",
          "ожидание": "320x180",
          "итог": "ок"
        },
        {
          "проверка": "частота кадров",
          "факт": "15/1",
          "ожидание": "15/1",
          "итог": "ок"
        },
        {
          "проверка": "длительность, с",
          "факт": 8.0,
          "ожидание": "8.0 ± 0.0667",
          "итог": "ок"
        },
        {
          "проверка": "кадров",
          "факт": 120,
          "ожидание": 120,
          "итог": "ок"
        },
        {
          "проверка": "видеодорожек",
          "факт": 1,
          "ожидание": 1,
          "итог": "ок"
        },
        {
          "проверка": "аудиодорожек (в исходнике звука нет)",
          "факт": 0,
          "ожидание": 0,
          "итог": "ок"
        },
        {
          "проверка": "контейнер/кодек",
          "факт": "mov,mp4,m4a,3gp,3g2,mj2/h264",
          "ожидание": "mp4/h264",
          "итог": "ок"
        }
      ],
      "исходник_не_изменён": true,
      "команда": "ffmpeg -y -hide_banner -v error -i 'маршруты/медиа/клип-02.mp4' -vf scale=320:180:flags=lanczos,setsar=1,fps=15 -c:v libx264 -preset medium -crf 18 -pix_fmt yuv420p -movflags +faststart -an 'результаты/клип-02-320x180-15fps.mp4'"
    },
    {
      "вход": "маршруты/медиа/клип-03.mp4",
      "выход": "результаты/клип-03-320x180-15fps.mp4",
      "параметры": {
        "разрешение": "320x180",
        "кадров_в_секунду": 15,
        "кодек": "libx264",
        "preset": "medium",
        "crf": 18,
        "pix_fmt": "yuv420p",
        "звук": "не переносится"
      },
      "исходник": {
        "длительность_с": 10.0,
        "размер_байт": 584496,
        "разрешение": "640x360",
        "частота_кадров": "25/1",
        "кадров": 250,
        "видеодорожек": 1,
        "аудиодорожек": 0,
        "кодек": "h264",
        "контейнер": "mov,mp4,m4a,3gp,3g2,mj2"
      },
      "результат": {
        "длительность_с": 10.0,
        "размер_байт": 302676,
        "разрешение": "320x180",
        "частота_кадров": "15/1",
        "кадров": 150,
        "видеодорожек": 1,
        "аудиодорожек": 0,
        "кодек": "h264",
        "контейнер": "mov,mp4,m4a,3gp,3g2,mj2"
      },
      "статус": "ок",
      "проверки": [
        {
          "проверка": "разрешение",
          "факт": "320x180",
          "ожидание": "320x180",
          "итог": "ок"
        },
        {
          "проверка": "частота кадров",
          "факт": "15/1",
          "ожидание": "15/1",
          "итог": "ок"
        },
        {
          "проверка": "длительность, с",
          "факт": 10.0,
          "ожидание": "10.0 ± 0.0667",
          "итог": "ок"
        },
        {
          "проверка": "кадров",
          "факт": 150,
          "ожидание": 150,
          "итог": "ок"
        },
        {
          "проверка": "видеодорожек",
          "факт": 1,
          "ожидание": 1,
          "итог": "ок"
        },
        {
          "проверка": "аудиодорожек (в исходнике звука нет)",
          "факт": 0,
          "ожидание": 0,
          "итог": "ок"
        },
        {
          "проверка": "контейнер/кодек",
          "факт": "mov,mp4,m4a,3gp,3g2,mj2/h264",
          "ожидание": "mp4/h264",
          "итог": "ок"
        }
      ],
      "исходник_не_изменён": true,
      "команда": "ffmpeg -y -hide_banner -v error -i 'маршруты/медиа/клип-03.mp4' -vf scale=320:180:flags=lanczos,setsar=1,fps=15 -c:v libx264 -preset medium -crf 18 -pix_fmt yuv420p -movflags +faststart -an 'результаты/клип-03-320x180-15fps.mp4'"
    },
    {
      "вход": "маршруты/медиа/учебный-ролик.mp4",
      "выход": "результаты/учебный-ролик-320x180-15fps.mp4",
      "параметры": {
        "разрешение": "320x180",
        "кадров_в_секунду": 15,
        "кодек": "libx264",
        "preset": "medium",
        "crf": 18,
        "pix_fmt": "yuv420p",
        "звук": "не переносится"
      },
      "исходник": {
        "длительность_с": 6.0,
        "размер_байт": 346486,
        "разрешение": "640x360",
        "частота_кадров": "25/1",
        "кадров": 150,
        "видеодорожек": 1,
        "аудиодорожек": 0,
        "кодек": "h264",
        "контейнер": "mov,mp4,m4a,3gp,3g2,mj2"
      },
      "результат": {
        "длительность_с": 6.0,
        "размер_байт": 180630,
        "разрешение": "320x180",
        "частота_кадров": "15/1",
        "кадров": 90,
        "видеодорожек": 1,
        "аудиодорожек": 0,
        "кодек": "h264",
        "контейнер": "mov,mp4,m4a,3gp,3g2,mj2"
      },
      "статус": "ок",
      "проверки": [
        {
          "проверка": "разрешение",
          "факт": "320x180",
          "ожидание": "320x180",
          "итог": "ок"
        },
        {
          "проверка": "частота кадров",
          "факт": "15/1",
          "ожидание": "15/1",
          "итог": "ок"
        },
        {
          "проверка": "длительность, с",
          "факт": 6.0,
          "ожидание": "6.0 ± 0.0667",
          "итог": "ок"
        },
        {
          "проверка": "кадров",
          "факт": 90,
          "ожидание": 90,
          "итог": "ок"
        },
        {
          "проверка": "видеодорожек",
          "факт": 1,
          "ожидание": 1,
          "итог": "ок"
        },
        {
          "проверка": "аудиодорожек (в исходнике звука нет)",
          "факт": 0,
          "ожидание": 0,
          "итог": "ок"
        },
        {
          "проверка": "контейнер/кодек",
          "факт": "mov,mp4,m4a,3gp,3g2,mj2/h264",
          "ожидание": "mp4/h264",
          "итог": "ок"
        }
      ],
      "исходник_не_изменён": true,
      "команда": "ffmpeg -y -hide_banner -v error -i 'маршруты/медиа/учебный-ролик.mp4' -vf scale=320:180:flags=lanczos,setsar=1,fps=15 -c:v libx264 -preset medium -crf 18 -pix_fmt yuv420p -movflags +faststart -an 'результаты/учебный-ролик-320x180-15fps.mp4'"
    }
  ]
}
