保持FFMPEG宽高比

时间:2011-11-21 20:49:13

标签: ffmpeg

我需要使用ffmpeg转换一堆视频文件。我运行一个很好地转换所有文件的bash文件,但是如果转换的文件不是16:9格式则会出现问题。当我将屏幕尺寸固定为-s 720x400时,如果原件的纵横比为4:3,则ffmpeg会创建一个16:9输出文件,拧紧纵横比。

是否有设置允许将宽高比设置为主要参数,并调整大小(例如,仅通过固定X或Y尺寸)?

8 个答案:

答案 0 :(得分:55)

-vf "scale=640:-1"

效果很好,直到遇到错误

[libx264 @ 0x2f08120] height not divisible by 2 (640x853)

所以最通用的方法是使用过滤器表达式:

scale=640:trunc(ow/a/2)*2

它取输出宽度(ow),除以宽高比(a),除以2,截断小数点后的数字并乘以2.它保证得到的高度可被2整除。

ffmpeg trac

的信用

<强>更新

正如评论所指出的那样,更简单的方法是使用-vf "scale=640:-2"。 致@BradWerth优雅解决方案

答案 1 :(得分:28)

例如:

1920x1080纵横比16:9 =&gt; 640x480方面4:3:

ffmpeg -y -i import.media -aspect 16:9 scale=640x360,pad=640:480:0:60:black output.media

宽高比16:9,尺寸宽度640pixel =&gt;身高360像素:
最终输出尺寸为640x480,垫60像素黑色图像(顶部和底部):

"-vf scale=640x360,pad=640:480:0:60:black"

答案 2 :(得分:20)

我很久以前就问过这个,但我实际上得到了一个我当时不知道的解决方案 - 为了保持宽高比,你应该使用视频滤镜比例,这是一个非常强大的过滤器

您可以像这样使用它:

-vf "scale=640:-1" 

这将固定宽度并提供保持纵横比所需的高度。但您也可以使用许多其他选项甚至数学函数,请查看此处的文档 - http://ffmpeg.org/ffmpeg.html#scale

答案 3 :(得分:8)

虽然大多数答案都很棒,但我一直在寻找可以调整目标尺寸(宽度高度)同时保持纵横比的命令。我能够使用ffmpeg的Expression Evaluation完成此任务。

这是相关的视频过滤器,目标尺寸为512:

-vf "thumbnail,scale='if(gt(iw,ih),512,trunc(oh*a/2)*2)':'if(gt(iw,ih),trunc(ow/a/2)*2,512)'"


输出宽度:

'if(gt(iw,ih),512,trunc(oh*a/2)*2)'

如果width大于height,则返回目标,否则返回比例宽度。


输出高度:

'if(gt(iw,ih),trunc(ow/a/2)*2,512)'

如果宽度大于高度,则返回比例高度,否则返回目标。

答案 4 :(得分:8)

使用ffmpeg trac中的force_original_aspect_ratio

ffmpeg -i input.mp4 -vf scale=720:400:force_original_aspect_ratio=decrease output.mp4

答案 5 :(得分:6)

如果您要拟合边界框,那么按照xmedeko's answer使用force_original_aspect_ratio是一个很好的起点。

但是,如果您的输入视频的尺寸 很奇怪,并且您将其编码为要求尺寸被2整除的格式,则将导致错误。

在这种情况下,您可以像在Charlie's answer中使用的那样,在scale函数中使用表达式求值。

假定输出边框为720x400:

-vf "scale='trunc(min(1,min(720/iw,400/ih))*iw/2)*2':'trunc(min(1,min(720/iw,400/ih))*ih/2)*2'"

要对此进行细分:

  • min(1,min(720/iw,400/ih)找到缩放因子以适合边界框(来自here),将其限制为最大1以确保仅缩小比例,并且
  • trunc(<scaling factor>*iw/2)*2trunc(<scaling factor>*iw/2)*2确保尺寸可以除以2,方法是将其除以2,使结果为整数,然后再乘以2。

这样就无需在编码之前先找到输入视频的尺寸。

答案 6 :(得分:0)

您可以使用ffmpeg -i获取原始文件的尺寸,并在命令中将其用于编码。你在ffmpeg上使用什么平台?

答案 7 :(得分:0)

如果存在'-aspect x:y'并且输出文件格式为ISO媒体文件格式(mp4),则ffmpeg将pasp-atom(PixelAspectRatioBox)添加到视频轨道的stsd-box中,以向播放器指示期望的                                长宽比。播放器应分别缩放视频帧。 无需在编码或转码之前缩放视频以使其适合宽高比,它应该由播放器执行。