![使用 ffmpeg 将不同宽度的视频调整为固定高度并保持宽高比](https://linux22.com/image/1254141/%E4%BD%BF%E7%94%A8%20ffmpeg%20%E5%B0%86%E4%B8%8D%E5%90%8C%E5%AE%BD%E5%BA%A6%E7%9A%84%E8%A7%86%E9%A2%91%E8%B0%83%E6%95%B4%E4%B8%BA%E5%9B%BA%E5%AE%9A%E9%AB%98%E5%BA%A6%E5%B9%B6%E4%BF%9D%E6%8C%81%E5%AE%BD%E9%AB%98%E6%AF%94.png)
我想将大量视频文件转换为 Flash 视频,用于我们公司的网站。我要求所有视频都必须是 360p 格式,因此它们的大小为 Nx360。
FFMpeg 用途-s指定目标分辨率的参数为西XH。 我不知道西idth,因为它取决于源文件的宽高比。如果源是 640x480,则目标将是 480x360。如果源是 848x480,则目标将是 636x360。
有没有办法通过 ffmpeg 的一些开关来实现这一点?它会保留纵横比并且我只需指定目标视频的高度吗?
我可以通过编写一个程序来轻松解决这个问题,该程序将启动 ffprobe 来获取源视频大小,计算纵横比,然后计算新的宽度。
答案1
您可以尝试添加这个视频过滤器:
-vf "scale=-1:360"
-1
在这种情况下意味着变量/未知,因此该过滤器会调整视频大小以保留输入的纵横比,并保持 360 作为高度。
对我来说,这实现了您所寻求的相同结果。
答案2
目前还没有足够的积分来评论现有的答案,但这是在用户 65600 的答案之后进行的,并且在特定编解码器需要可被 2 整除的宽度/高度时更进一步(例如 libx264)
当您使用 -1(变量/未知)时,它可以返回奇数 #。为了保证偶数 #,您必须使用类似 的方法trunc(ow/a/2)*2
,它将自动计算最接近的偶数 #,同时保留纵横比。
-vf "scale=trunc(ow/a/2)*2:360"
答案3
-vf "scale=trunc(ow/a/2)*2:360"
由于“自引用”错误而无法工作。
相反,下面的方法有效:
-vf“比例=-1:360,比例=trunc(iw/2)*2:360”
这样,通过两次连续缩放就避免了自引用,并在第二步中完成舍入。很可爱,不是吗?:)