Ошибка «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. Плееры умеют «чинить» мелкие дефекты контейнера на лету, поэтому успешное воспроизведение ещё не означает, что файл исправен для перекодирования. Но если даже плеер показывает чёрный экран или артефакты с первых секунд — исходник повреждён серьёзно.
Исправление команды 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, чтобы не ждать обработки всего файла.
☑️ Проверка команды перед запуском
Восстановление повреждённого исходника
Если метаданные файла повреждены, часто помогает рем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 перепаковывает поток без перекодирования и потерь. Если же испорчены сами закодированные данные, без перекодирования не обойтись, и повреждённые фрагменты будут утрачены.