Как исправить растяжение видео при объединении в FFmpeg: подробный гайд

Вы работаете с FFmpeg и заметили, что видео после объединения деформируется – особенно при использовании параметров вроде force_original_aspect_ratio=increase? Эта проблема часто возникает из-за тонкостей в настройке соотношения сторон (aspect ratio) и масштабирования. Давайте разберёмся, как FFmpeg обрабатывает такие сценарии и что можно сделать, чтобы сохранить пропорции.

Кстати, ключевая сложность здесь связана с тем, как фильтры scale и setsar взаимодействуют с исходными параметрами видео. Например, если исходный файл имеет нестандартное разрешение (скажем, screen recording с кастомным аспектом), автоматическое масштабирование может давать сбой. В таких случаях FFmpeg пытается «подогнать» видео под заданные размеры, но без точных указаний – результат непредсказуем.

Почему видео растягивается и как это исправить

В вашем случае проблема возникает из-за того, что force_original_aspect_ratio=increase масштабирует видео так, чтобы оно полностью заполнило целевую область (720×1280), но при этом сохраняло оригинальное соотношение сторон. Однако если исходное разрешение видео некратно целевому или имеет «плавающий» SAR (Sample Aspect Ratio), алгоритм может неправильно рассчитать ширину.

Рабочее решение из примера использует комбинацию фильтров scale и pad, чтобы вручную задать нужные параметры:

set /A calc_width = (1280*16)/9
ffmpeg -i input.mp4 -vf "scale=-1:1280, pad=%calc_width%:1280:(ow-iw)/2:0:black" ...

Здесь происходит следующее:

  1. Масштабирование по высоте: scale=-1:1280 – высота фиксируется как 1280 пикселей, а ширина автоматически подстраивается, сохраняя пропорции.
  2. Добавление чёрных полей: pad расширяет ширину до вычисленного значения calc_width (2275 для 16:9), центрируя видео по горизонтали.

Этот подход гарантирует, что все видео перед склейкой будут иметь одинаковую ширину и высоту, что исключает деформацию. Но важно понимать, откуда берётся calc_width. В примере используется формула (1280*16)/9, которая соответствует соотношению 16:9 для высоты 1280. Если ваши видео имеют другое соотношение (например, 4:5 или 1:1), формулу нужно адаптировать.

Тонкости настройки и частые ошибки

1. Проверяйте исходные параметры видео:

Используйте ffprobe input.mp4, чтобы узнать реальное разрешение и SAR. Иногда метаданные файла могут быть некорректными (например, screen recording с изменённым DAR – Display Aspect Ratio), из-за чего FFmpeg берёт не те значения.

2. Фильтр pad требует точных расчётов:

  • Если calc_width меньше ширины исходного видео после масштабирования – появятся чёрные поля по бокам.
  • Если calc_width больше – видео будет обрезано (если не использовать x=(ow-iw)/2 для центрирования).

3. Избегайте нечётных значений в размерах:

Некоторые кодеки (включая x264) требуют чётных чисел для ширины и высоты. Добавьте pad=ceil(iw/2)*2:ceil(ih/2)*2 в цепочку фильтров, чтобы автоматически округлять размеры.

4. Конкатенация только после подготовки:

Перед использованием concat убедитесь, что все видео имеют одинаковые:

  • Разрешение,
  • Частоту кадров (указанную в -r),
  • Пиксельный формат (например, yuv420p).

В противном случае FFmpeg может применить неявное масштабирование, что снова приведёт к деформации.

Пример финальной команды для склейки:

ffmpeg -f concat -i mylist.txt -vf "scale=2275:1280,pad=2276:1280:0:0:black" -c:v libx264 output.mp4

Здесь pad=2276 вместо 2275 – чтобы сделать ширину чётной (простое, но важное исправление).

Совет: Если видео всё равно выглядит растянутым, попробуйте явно указать setsar=1 в фильтрах. Иногда SAR, отличный от 1, ломает отображение в плеерах, даже если DAR правильный.

И последнее: не бойтесь экспериментировать с промежуточными файлами. Например, сохраните результат после scale и pad до конкатенации, чтобы проверить, как выглядит каждое видео по отдельности. Это поможет локализовать проблему, если она возникает на конкретном этапе.

Кстати, если времени на ручные расчёты нет, можно использовать динамическое вычисление параметров в командной строке – как в примере с set /A calc_width. Это особенно удобно при работе с видео разного разрешения. Главное – всегда проверяйте логи FFmpeg: там отображаются итоговые размеры кадра после применения фильтров.

Добавить комментарий

Все поля обязательны к заполнению. Ваш адрес email не будет виден никому.

Новое
Интересное