Мне нужно подогнать видео до 640x360 (максимум, который может обрабатывать плеер моего телефона), при этом сохраняя соотношение сторон , но я также хочу, чтобы видео не изменялось, если оно меньше 640x360 (нет смысла увеличивать его в конце концов).
Есть ли способ получить это поведение с помощью командной строки ffmpeg?
min(…)
но, безусловно, проще с простым скриптом, который анализирует измерения. Смотрите мою команду здесь для примера того, что можно сделать: superuser.com/questions/547296/…Ответы:
В новых версиях ffmpeg вы можете использовать опцию
scale
фильтраforce_original_aspect_ratio
. Например, чтобы разместить видео в разрешении 1280 × 720 без увеличения (см. Этот пост для получения дополнительной информации):Здесь
scale
фильтр масштабируется до 1280 × 720, если входное видео больше этого. Если он меньше, он не будет увеличен.pad
Фильтр необходим довести вывод видео до 1280 × 720, в случае , если его соотношение сторон или размера отличается от заданного размера.В старых версиях ffmpeg есть несколько хакерских решений. Сначала определите ширину, высоту и соотношение сторон вашего вывода. Это спасет нас от набора текста.
Теперь давайте применим супер сложную команду фильтра, которую написал Джим Уорралл :
Я не буду подробно объяснять, что все это делает, но в основном вы можете кормить его любым видео, и оно будет только уменьшать, а не улучшать. Если вы готовы к этому, вы можете разделить фильтр на отдельные выражения. Можно было бы сократить это, но это также работает.
источник
Более читаемая версия может выглядеть следующим образом:
640 / iw - коэффициент горизонтального масштабирования, а 360 / ih - коэффициент вертикального масштабирования.
Вы хотите поместить масштабированное изображение в поле вывода и сохранить соотношение сторон (хранилище). Вы делаете это, выбирая наименьший коэффициент масштабирования с минимальной функцией: min (640 / iw, 360 / ih)
Вы хотите предотвратить любое масштабирование (т.е. коэффициент масштабирования> 1,0), поэтому вы добавляете еще одну минимальную функцию: min (1, min (640 / iw, 360 / ih))
Следующим шагом является вычисление выходного разрешения путем умножения масштабного коэффициента на input-width и input-height:
output-width = iw * min (1, min (640 / iw, 360 / ih))
output-height = ih * min (1, min (640 / iw, 360 / ih))
Последний шаг - создание команды фильтра. Нет необходимости указывать output-height, вы можете указать -1, и ffmpeg сохранит соотношение сторон, применяя тот же коэффициент масштабирования, что и для ширины.
источник
У меня тоже была такая же проблема, но она была решена путем подгонки видео в квадрат 640x640 (из-за вертикальных видео, сделанных на смартфонах).
Итак, используя логику immerzi и некоторые исследования, я получаю следующее:
последняя часть предназначена для высоты, делимой на 2, которая нужна многим кодировщикам.
источник