Как изменить размер кадра, сохранив ширину (используя ffmpeg)?

21

Я новичок в этом сайте StackExchange и в использовании кодера FFmpeg. У меня есть видео размером 720x480 (3: 2), которое я хотел бы изменить на 720x406 (16: 9), чтобы соответствовать другим видео, которые у меня есть для сайта. Я пробовал различные комбинации команд, в том числе:

ffmpeg -i myfile.mv4 -s 720x406 outfile.mp4
ffmpeg -i myfile.m4v -c copy -aspect 16:9 outfile.mp4

В итоге я получаю видео, которое уменьшено до указанной высоты, но не сохранило ширину. Это заканчивается в 608x406 или около того. Сегодня я играл с различными версиями FFmpeg с графическим интерфейсом, и они, кажется, делают то же самое.

Какие параметры / параметры следует передать (при условии, что я получу больше контроля через командную строку) для достижения желаемого размера кадра?

eljefejb
источник

Ответы:

36

использование фильтра масштаба сделает это, но есть кое-что еще.

ffmpeg -i input.mov -vf scale=720x406 output.mov 

создаст фильм с необходимыми размерами в пикселях, но если вы посмотрите на вывод, вы обнаружите, что он добавляет информацию в метаданные, так что он будет воспроизводиться с тем же соотношением сторон, что и оригинал, с использованием неквадратных пикселей. Поэтому, если вы хотите растянуть фильм анаморфно до нового соотношения сторон, вам нужно вручную установить соотношение сторон пикселя, называемое SAR для «Sample Aspect Ratio», таким образом, для квадратных пикселей используйте:

ffmpeg -i input.mov -vf scale=720x406,setsar=1:1 output.mov

В качестве альтернативы вы можете установить соотношение сторон дисплея на то, что вы хотите, таким образом:

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 output.mov

То, что я делаю с помощью команды -vf и выражений x = y, z = a, создает цепочку фильтров . Фильтры могут быть довольно сложными, но при наиболее простом использовании они принимают форму effect=parameter,nexteffect=anotherparameterи обрабатываются в том порядке, в котором вы их пишете.

Возможно, вы захотите добавить дополнительные команды для кодека и т. Д., Например, -c:v libx264использовать кодер x264 mp4 и что-то вроде -crf 20установить коэффициент постоянной скорости равным 20 (обычно это довольно хороший компромисс между размером и качеством). Итак, достаточно полная команда будет выглядеть так:

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 -c:v libx264 -preset slow -profile:v main -crf 20 output.mov

Основной профиль хорош для совместимости устройств, slowпредустановка для кодера libx264 - это довольно хороший баланс скорости и качества, так что это хорошая рабочая лошадка для веб-кодирования. Вы можете сделать это быстрее, используя fastили veryfastили медленнее, veryslowи placeboсделаете это немного лучше, чем veryslowза счет гораздо большего времени обработки (отсюда и название).

КСТАТИ Не используйте -c копию , что означает просто скопировать видео и аудио потоки , ничего не делая для них на всех , так что вы ничего сделать с точки зрения масштаба, кодек, битрейт и т.д. будет иметь никакого эффекта.

STIB
источник
1
Если вы используете последние версии ffmpeg, вам больше не нужно указывать x264 в качестве кодека, но все же стоит посмотреть, какие настройки вам могут понадобиться.
STIB
1
Я думаю, что метаданные имеют только поле DAR. То есть использование setsarпросто косвенно устанавливает DAR?
jiggunjer
Я должен использовать «-c копию», но с другой стороны я хочу изменить размер экрана. Как мне этого добиться?
Dr.jacky
1
@ Mr.Hyde, задавайте это как новый вопрос вместо того, чтобы задавать его в комментарии
stib