我需要将视频调整为 640x360(我的手机播放器可以处理的最大值),同时还要保留纵横比,但我也希望视频在小于640x360 时保持不变(毕竟放大它没有意义)。
有没有办法使用 ffmpeg 的命令行来获得这种行为?
imm*_*rzl 19
更具可读性的版本可能如下所示:
-filter_complex "scale=iw*min(1\,min(640/iw\,360/ih)):-1"
Run Code Online (Sandbox Code Playgroud)
640/iw 是水平比例因子,360/ih 是垂直比例因子
您希望在输出框中适合缩放的图像并保持(存储)纵横比。您可以通过选择具有最小函数的最小缩放因子来实现此目的:min(640/iw, 360/ih)
您想防止任何放大(即比例因子 > 1.0),因此您添加另一个最小函数: min(1, min(640/iw, 360/ih))
下一步是通过将缩放因子与输入宽度和输入高度相乘来计算输出分辨率:
output-width = iw * min(1, min(640/iw, 360/ih))
output-height = ih * min(1, min(640/iw, 360/ih))
最后一步是构建过滤器命令。无需指定输出高度,您可以指定 -1,ffmpeg 将通过应用与宽度相同的缩放因子来保持纵横比。
slh*_*hck 17
对于较新的 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
Run Code Online (Sandbox Code Playgroud)
在这里,scale如果输入视频大于 1280×720 ,过滤器会缩放到 1280×720。如果它更小,它将不会被放大。该pad过滤器是必要的与目标尺寸使输出视频到1280×720,在情况下,其纵横比或尺寸不同。
对于较旧的 ffmpeg 版本,有一个有点棘手的解决方法。首先,定义输出的宽度、高度和纵横比。这将为我们节省一些打字时间。
width=640; height=360
aspect=$( bc <<< "scale=3; $width / $height") # <= floating point division
Run Code Online (Sandbox Code Playgroud)
现在,让我们应用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
Run Code Online (Sandbox Code Playgroud)
我不会真正解释这一切的作用,但基本上你可以提供任何视频,它只会缩小规模,而不是高档。如果您愿意,您可以将过滤器分解为单独的表达式。也许可以缩短它,但它也是如此。
小智 5
我也有同样的问题,但通过将视频安装在 640x640 的正方形中解决了(因为使用智能手机制作的垂直视频)。
所以使用immerzi逻辑和一些研究,我最终得到了这个:
-vf "scale=iw*min(1\,if(gt(iw\,ih)\,640/iw\,(640*sar)/ih)):(floor((ow/dar)/2))*2"
Run Code Online (Sandbox Code Playgroud)
最后一部分是为了具有许多编码器需要的可被 2 整除的高度。
| 归档时间: |
|
| 查看次数: |
12758 次 |
| 最近记录: |