如何将视频调整为特定大小,但不使用FFmpeg放大视频?


13

我需要将视频调整为640x360(我的手机播放器可以处理的最大大小),同时还要保留宽高比,但是我也希望视频如果小于 640x360 ,则视频应该保持不变(毕竟没有必要进行放大)。

有没有一种方法可以使用ffmpeg的命令行获得此行为?


我不认为只能在ffmpeg中完成此操作,但是如果您愿意编写脚本,则一定可以完成。
evilsoup

我已经编写了脚本,但是我想清理我的代码以防不必要。
sashoalm

使用比例函数的比例过滤器可能是可能的,min(…)但是使用解析尺寸的简单脚本绝对可以更轻松地实现。见我的命令这里的什么可以做一个例子:superuser.com/questions/547296/...
slhck

Answers:


10

对于较新的ffmpeg版本,您可以使用scale过滤器的force_original_aspect_ratio选项。例如,要将视频调整为1280×720,而不进行放大(有关更多信息,请参见此帖子):

ffmpeg -i input.mp4 -filter:v "scale='min(1280,iw)':min'(720,ih)':force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" output.mp4

在此,scale如果输入视频大于1280×720 ,则滤镜将缩放为1280×720。如果较小,则不会放大。pad如果其宽高比或尺寸与目标尺寸不同,则必须使用该过滤器才能将输出视频带到1280×720。


对于较旧的ffmpeg版本,存在一些棘手的解决方法。首先,定义输出的宽度,高度和纵横比。这将为我们节省键入时间。

width=640; height=360
aspect=$( bc <<< "scale=3; $width / $height") # <= floating point division

现在,让我们应用Jim Worrall编写的超复杂过滤器命令:

ffmpeg -i input.mp4 -vf "scale = min(1\,gt(iw\,$width)+gt(ih\,$height)) * (gte(a\,$aspect)*$width + \
lt(a\,$aspect)*(($height*iw)/ih)) + not(min(1\,gt(iw\,$width)+gt(ih\,$height)))*iw : \
min(1\,gt(iw\,$width)+gt(ih\,$height)) * (lte(a\,$aspect)*$height + \
gt(a\,$aspect)*(($width*ih)/iw)) + not(min(1\,gt(iw\,$width)+gt(ih\,$height)))*ih" \
output.mp4

我不会真正解释这一切,但是基本上您可以将其提供给任何视频,并且它只会缩小,而不会放大。如果您愿意,可以将过滤器分解为各个表达式。可能可以缩短它,但它也可以那样工作。


1
+1,但这真是一个可怕的命令:P
evilsoup

我知道,对吧?我花了十分钟试图将其分解为逻辑部分,然后插入一些值,但我放弃了。它有些旧,也许可以比这更简洁地编写它。
slhck

14

更具可读性的版本如下所示:

-filter_complex "scale=iw*min(1\,min(640/iw\,360/ih)):-1"

640 / iw是水平缩放因子,360 / ih是垂直缩放因子

您想将缩放后的图像放入输出框内,并保持(存储)长宽比。通过选择具有最小功能的最小比例因子来执行此操作:min(640 / iw,360 / ih)

您要防止任何放大(即缩放系数> 1.0),因此添加了另一个最小函数:min(1,min(640 / iw,360 / ih))

下一步是通过将比例因子乘以输入宽度和输入高度来计算输出分辨率:
输出宽度= iw * min(1,min(640 / iw,360 / ih))
output-height = ih * min(1,min(640 / iw,360 / ih))

最后一步是构造filter命令。无需指定output-height,您可以指定-1,并且ffmpeg将通过应用与宽度相同的缩放因子来保持宽高比。


A +开箱即用。所选答案的解决方案保留长宽比。它挤压了框架。
287352年

5

我也遇到了同样的问题,但是通过将视频调整为640x640正方形来解决(因为使用智能手机制作的垂直视频)。

因此,使用沉浸式逻辑和一些研究最终得出了以下结论:

-vf "scale=iw*min(1\,if(gt(iw\,ih)\,640/iw\,(640*sar)/ih)):(floor((ow/dar)/2))*2"

最后一部分是高度,该高度可以被许多编码器所需的2整除。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.