我需要使用ffmpeg转换一堆视频文件。我运行一个很好地转换所有文件的bash文件,但是如果转换的文件不是16:9格式则会出现问题。当我将屏幕尺寸固定为-s 720x400时,如果原件的纵横比为4:3,则ffmpeg会创建一个16:9输出文件,拧紧纵横比。
是否有设置允许将宽高比设置为主要参数,并调整大小(例如,仅通过固定X或Y尺寸)?
答案 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整除。
的信用<强>更新强>
正如评论所指出的那样,更简单的方法是使用-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)*2
和trunc(<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中,以向播放器指示期望的 长宽比。播放器应分别缩放视频帧。 无需在编码或转码之前缩放视频以使其适合宽高比,它应该由播放器执行。