Стоп FFMPEG апскейлинг видео

1

Я использую FFMPEG для перекодирования видео, функция которого запускается автоматически. Я пытаюсь уменьшить масштаб видео до нескольких разрешений, сохраняя соотношение сторон (уменьшить до нужного размера). Если исходное разрешение видео меньше разрешения, указанного в команде, пропустите перекодирование и прекратите создание выходного файла для этого конкретного разрешения.

Например:

У меня есть видео с разрешением 1920x1080

Выход:

  • 3840x2160 (Пропустить / Остановить)
  • 2560x1440 (Пропустить / Остановить)
  • 1920x1080 (перейдите к output-1080p.mp4)
  • 1280x720 (перейдите к output-720p.mp4)

Я перепробовал много команд, но ни одна из них не работает. Могу ли я узнать, есть ли команда, которая может этого добиться?

Ниже приведена последняя рабочая команда, которую я имею для FFMPEG. Извините, я новичок в FFMPEG, я понимаю, что текущая команда все еще далека от того, к чему я стремлюсь.

ffmpeg -i sample.mp4 -c:a copy -vf scale='min(2160\,iw):-2' -movflags +faststart out2160.mp4 -vf scale='min(1440\,iw):-2' -movflags +faststart out1440.mp4 -vf scale='min(1080\,iw):-2' -movflags +faststart out1080.mp4 -vf scale='min(720\,iw):-2' -movflags +faststart out720.mp4 -vf thumbnail -vf scale='min(500\,iw):-2' -vframes 1 thumb500.png -vf scale='min(270\,iw):-2' -vframes 1 thumb270.png

Если sample.mp4 имеет разрешение 1920x1080p или даже меньше, эта команда выведет следующие файлы:

  • out2160.mp4
  • out1440.mp4
  • out1080.mp4
  • out720.mp4
  • thumb500.png
  • thumb270.png

Поскольку я запускаю FFMPEG автоматически, я хочу, чтобы команда могла сравнивать установленное разрешение. Если исходное разрешение видео меньше, просто пропустите его, нет смысла создавать или масштабировать файл, размер которого больше исходного разрешения. Выводите только то же или меньшее разрешение, сохраняя соотношение сторон (уменьшите, чтобы соответствовать). Было бы здорово, если бы вы могли помочь мне в этом, спасибо еще раз.

Джессика
источник
Какова ваша текущая команда транскодирования?
Гаян
Привет @Mulvya, спасибо за ваш ответ. Поскольку я не могу оставить здесь длинный комментарий, пожалуйста, обратитесь к Обновлению 2 выше, спасибо.
Джессика

Ответы:

1

Это можно сделать, используя фильтр обрезки, который не будет работать, если обрезанные выходные размеры будут больше, чем входные. Если команда не выполняется, выходной файл будет создан, но его размер будет равен 0.

Каждый вариант нужно будет конвертировать с помощью отдельной команды. Невозможно использовать одну команду, так как при сбое одного из конвейеров вся команда отменяется.

Фильтр обрезки должен использоваться следующим образом:

ffmpeg -i sample.mp4 -c:a copy -vf crop=iw:'max(ih,2160)',scale=-2:2160 -movflags +faststart out2160.mp4 

Ширина обрезки совпадает с шириной ввода. Высота обрезки устанавливается на максимум входной высоты и целевой высоты. Если высота ввода меньше целевой, инициализация фильтра обрезки завершится неудачно, и команда будет прервана. Если входная высота равна или больше, то полная ширина и высота передаются в фильтр масштаба.

Gyan
источник