我需要将视频调整为640x360(我的手机播放器可以处理的最大大小),同时还要保留宽高比,但是我也希望视频如果小于 640x360 ,则视频应该保持不变(毕竟没有必要进行放大)。
有没有一种方法可以使用ffmpeg的命令行获得此行为?
min(…)
但是使用解析尺寸的简单脚本绝对可以更轻松地实现。见我的命令这里的什么可以做一个例子:superuser.com/questions/547296/...
我需要将视频调整为640x360(我的手机播放器可以处理的最大大小),同时还要保留宽高比,但是我也希望视频如果小于 640x360 ,则视频应该保持不变(毕竟没有必要进行放大)。
有没有一种方法可以使用ffmpeg的命令行获得此行为?
min(…)
但是使用解析尺寸的简单脚本绝对可以更轻松地实现。见我的命令这里的什么可以做一个例子:superuser.com/questions/547296/...
Answers:
对于较新的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
我不会真正解释这一切,但是基本上您可以将其提供给任何视频,并且它只会缩小,而不会放大。如果您愿意,可以将过滤器分解为各个表达式。可能可以缩短它,但它也可以那样工作。
更具可读性的版本如下所示:
-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将通过应用与宽度相同的缩放因子来保持宽高比。