Изменение размера видео с различной шириной до фиксированной высоты с сохранением соотношения сторон с помощью ffmpeg

17

Я хотел бы преобразовать много видеофайлов во флэш-видео для веб-сайта нашей компании. У меня есть требование, чтобы все видео были в формате 360p, поэтому их размер должен быть Nx360.

FFMpeg использует -s аргумент , чтобы указать целевое разрешение , как W х H . Я не знаю W idth, так как это зависит от соотношения сторон исходного файла. Если источник 640x480, цель будет 480x360. Если источник 848x480, цель будет 636x360.

Есть ли способ сделать это с некоторым переключателем ffmpeg? Что он сохранит пропорции, а я укажу только высоту целевого видео?

Я мог бы легко решить эту проблему, создав программу, которая запустит ffprobe, чтобы получить исходный размер видео, вычислить соотношение сторон и затем рассчитать новую ширину.

Axarydax
источник

Ответы:

15

Вы можете попробовать добавить этот видеофильтр:

-vf "scale=-1:360" 

-1 в этом случае означает переменную / неизвестный, таким образом, этот фильтр изменяет размер видео, чтобы сохранить соотношение сторон входного сигнала, оставляя 360 в качестве высоты.

Для меня это достигло того же результата, который вы ищете.

user65600
источник
6

Пока у вас недостаточно очков, чтобы комментировать существующий ответ, но он следует за ответом пользователя 65600 и идет дальше, когда конкретным кодекам требуется ширина / высота, кратная 2 (например, libx264)

Когда вы используете -1 (переменная / неизвестная), он может вернуть нечетный #. Чтобы гарантировать четное число #, вы должны использовать что-то вроде trunc(ow/a/2)*2, которое автоматически вычислит самый близкий четный # при сохранении соотношения сторон.

-vf "scale=trunc(ow/a/2)*2:360"

Источник: https://ffmpeg.org/trac/ffmpeg/ticket/309

Толанд Н
источник
3

-vf "scale=trunc(ow/a/2)*2:360" не работает из-за ошибки "самообращения".

Вместо этого работает следующее:

-vf "scale = -1: 360, scale = trunc (iw / 2) * 2: 360"

Таким образом, избегаются самостоятельные ссылки путем двух последовательного масштабирования, а округление выполняется на втором этапе. Милый, не правда ли? :)

ddystill
источник
Масштаб простого фильтра графа = -1: 480; scale = trunc (iw / 2) * 2: 480 'не имеет ровно одного входа и выхода. Ошибка открытия фильтров!
digitalPBK