Ошибка invalid frame dimension negative or non finite: причины и исправление

Ошибка «invalid frame dimension negative or non finite» возникает в момент, когда видеокодек или библиотека обработки кадров получает размеры кадра, равные нулю, отрицательному числу или значению NaN (не число). Чаще всего с ней сталкиваются пользователи FFmpeg, видеоредакторов и программ для конвертации, когда исходный файл повреждён, а фильтр масштабирования вычисляет некорректные ширину и высоту. Конвертация прерывается, а выходной файл либо не создаётся, либо оказывается пустым.

Проблема не связана с железом: это программная ошибка валидации параметров кадра. Хорошая новость в том, что в подавляющем большинстве случаев её можно устранить корректировкой команды, заменой фильтра или перекодированием исходника. Ниже разберём, откуда берутся «битые» размеры кадра и как действовать пошагово.

Что означает эта ошибка

Любой видеокадр описывается как минимум двумя параметрами — шириной и высотой в пикселях. Перед обработкой библиотека проверяет, что оба значения являются конечными положительными числами. Если в метаданных потока записан ноль, отрицательное значение, бесконечность (Infinity) или результат неудачного вычисления (NaN), проверка завершается ошибкой invalid frame dimension.

Такое случается в нескольких типичных ситуациях. Файл может быть обрезан при скачивании, и заголовок с размерами кадра не прочитался. Фильтр масштабирования мог получить на вход переменные, которые вычислились в ноль — например, выражение scale=iw/2:ih/2 для потока, у которого ширина не определена. Наконец, сам исходник мог быть создан с ошибкой: некоторые записывающие утилиты и скринкастеры при сбое пишут в контейнер некорректные метаданные.

Важно понимать: сообщение указывает на симптом, а не на конкретную причину. Поэтому диагностику стоит начинать с проверки самого файла, а не с переустановки программы.

Основные причины появления

  • 🔧 Повреждённый или недокачанный файл — заголовок потока не содержит корректных размеров кадра.
  • 📐 Ошибка в фильтре масштабирования — выражение scale или crop вычисляет нулевой или дробный размер, который округляется до недопустимого значения.
  • 🌀 Нестандартные метаданные поворота — теги rotation в контейнере иногда приводят к тому, что ширина и высота меняются местами или обнуляются при обработке.
  • 🧩 Несовместимость кодека и контейнера — поток, записанный с нарушением спецификации, корректно играется плеером, но ломается при перекодировании.
  • 💾 Сбой при записи исходника — прерванная запись со смартфона, экранного рекордера или камеры оставляет незавершённый контейнер.
⚠️ Внимание: если ошибка возникает только с одним конкретным файлом, а остальные видео обрабатываются нормально, почти наверняка проблема в самом файле, а не в настройках программы. Не спешите переустанавливать кодеки и драйверы.

Диагностика: проверяем исходный файл

Первым делом необходимо выяснить, какие размеры кадра реально записаны в потоке. Для этого удобнее всего использовать утилиту ffprobe, которая входит в комплект FFmpeg. Откройте терминал или командную строку и выполните:

ffprobe -v error -select_streams v:0 -show_entries stream=width,height,codec_name -of default=noprint_wrappers=1 video.mp4

Если в выводе поля width или height отсутствуют, равны нулю или содержат N/A — источник проблемы найден: метаданные файла повреждены. Если размеры отображаются корректно, значит, сбой происходит на этапе применения фильтров, и нужно проверять саму команду конвертации.

Дополнительно стоит попробовать просто воспроизвести файл в плеере, например в VLC. Плееры умеют «чинить» мелкие дефекты контейнера на лету, поэтому успешное воспроизведение ещё не означает, что файл исправен для перекодирования. Но если даже плеер показывает чёрный экран или артефакты с первых секунд — исходник повреждён серьёзно.

📊 Где вы столкнулись с ошибкой invalid frame dimension?
FFmpeg или конвертер на его основе
Видеоредактор (Premiere, DaVinci и др.)
Плеер или просмотрщик
Скрипт / собственная программа

Исправление команды FFmpeg

Когда исходный файл в порядке, причина почти всегда кроется в цепочке фильтров. Типичный сценарий — динамическое вычисление размеров, которое даёт дробный или нулевой результат. Например, выражение scale=iw/3:-1 для некоторых нечётных размеров может вычислить неподдерживаемое значение.

Используйте явные чётные размеры и округление. Вместо вычислений «в лоб» задавайте выражения с принудительным округлением до чётного числа, поскольку многие кодеки (в частности, H.264 с цветовой субдискретизацией 4:2:0) требуют чётных ширины и высоты:

ffmpeg -i input.mp4 -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -c:v libx264 output.mp4

Также проверьте порядок фильтров: если crop применяется после scale, координаты обрезки могут выйти за границы кадра и дать нулевую область. Логичнее сначала обрезать, потом масштабировать, и после каждого изменения команды запускать тест на коротком фрагменте с параметром -t 10, чтобы не ждать обработки всего файла.

☑️ Проверка команды перед запуском

Выполнено: 0 / 4

Восстановление повреждённого исходника

Если метаданные файла повреждены, часто помогает ремuxинг — перепаковка потока в новый контейнер без перекодирования. При этом FFmpeg заново считывает поток и пересчитывает заголовки:

ffmpeg -err_detect ignore_err -i broken.mp4 -c copy fixed.mp4

Когда реmuxинг не помогает, остаётся полное перекодирование с игнорированием ошибочных кадров. Процесс дольше, но декодер пропустит повреждённые участки и запишет корректные заголовки заново. Учтите, что испорченные фрагменты видео при этом будут потеряны или заменены артефактами — это ограничение самого метода, а не команды.

Для файлов, скачанных из интернета, самое надёжное решение — загрузить их заново. Недокачанный файл невозможно «дочинить» программно, если отсутствует часть данных, а не только заголовок.

СитуацияПризнакРешение
Битые метаданныеffprobe показывает width/height = 0 или N/AРемuxинг с -err_detect ignore_err
Ошибка в фильтреРазмеры корректны, сбой при конвертацииЧётные размеры, проверка порядка фильтров
Недокачанный файлПлеер обрывает воспроизведениеПовторная загрузка файла
Нестандартный поворотРазмеры меняются местамиСброс метаданных поворота при перекодировании
Почему плеер играет файл, а конвертер падает

Плееры используют эвристики восстановления: они подставляют размеры кадра из самих закодированных данных, если заголовок контейнера повреждён. Конвертеры же строго валидируют параметры перед обработкой, поэтому отклоняют файл, который плеер показывает без проблем.

Ошибка в видеоредакторах и скриптах

В видеоредакторах вроде DaVinci Resolve или Premiere Pro аналогичная ошибка может возникать при экспорте, если в проекте есть клип с нулевой длительностью, «пустой» вложенная секвенция или эффект трансформации, выставивший масштаб в ноль. Проверьте таймлайн на предмет таких элементов — часто это почти невидимый обрезок длиной в один кадр или клип, у которого параметр масштаба случайно обнулён.

В собственных скриптах и программах (например, на Python с OpenCV или moviepy) ошибка появляется, когда размеры кадра вычисляются из переменных, которые не были инициализированы. Добавьте проверку перед вызовом функции изменения размера: убедитесь, что ширина и высота больше нуля и являются конечными числами. Это дешёвая страховка, которая превращает непонятный сбой в читаемое сообщение об ошибке.

⚠️ Внимание: при пакетной обработке большого числа файлов один повреждённый исходник может останавливать всю очередь. Настройте скрипт так, чтобы ошибочные файлы пропускались и записывались в отдельный лог, а не прерывали весь процесс.

Профилактика проблемы

Чтобы не сталкиваться с подобными сбоями регулярно, достаточно выстроить простой порядок работы. Сначала — проверка любого нового исходника через ffprobe перед постановкой в очередь на конвертацию. Затем — использование явных, жёстко заданных размеров в командах, где это возможно, вместо динамических вычислений.

Также полезно хранить исходники без промежуточных перекодирований «экзотическими» утилитами: каждый лишний проход через малоизвестный конвертер повышает шанс получить контейнер с нарушенной спецификацией. А при записи видео с экрана или камеры дождитесь полного завершения записи и сохранения файла, прежде чем закрывать программу.

Частые вопросы

Может ли ошибка быть вызвана нехваткой оперативной памяти?

Напрямую — нет. Ошибка относится к валидации размеров кадра, а не к ресурсам системы. Нехватка памяти проявляется другими сообщениями. Однако сбой при записи файла из-за нехватки места на диске может косвенно привести к повреждению заголовков.

Почему ошибка возникает только с видео, снятыми на телефон?

Ролики со смартфонов часто содержат метаданные поворота и могут быть повреждены при прерванной записи или передаче через мессенджеры, которые пережимают файл. Проверьте такой файл через ffprobe и попробуйте реmuxинг.

Поможет ли переустановка FFmpeg?

Очень маловероятно. Сообщение формируется логикой валидации, которая одинакова в актуальных версиях. Сначала проверьте сам файл и команду — переустановка имеет смысл, только если ошибка возникает на любых, заведомо исправных видео.

Что делать, если ошибка появляется в середине длинной конвертации?

Это указывает на повреждённый участок внутри файла. Используйте перекодирование с параметром -err_detect ignore_err, чтобы декодер пропускал битые кадры, либо определите проблемный фрагмент и обработайте файл по частям.

Можно ли исправить файл без потери качества?

Да, если повреждены только метаданные контейнера — реmuxинг с -c copy перепаковывает поток без перекодирования и потерь. Если же испорчены сами закодированные данные, без перекодирования не обойтись, и повреждённые фрагменты будут утрачены.