FFmpeg - 更改具有宽高比的视频分辨率

24

如何使用FFmpeg更改具有宽高比的视频的分辨率?

有选项 http://manpages.ubuntu.com/manpages/oneiric/man1/ffmpeg.1.html

       -s size
       Set frame size. The format is wxh (ffserver default = 160x128,
       ffmpeg default = same as source).  The following abbreviations are
       recognized:

       -aspect aspect
       Set the video display aspect ratio specified by aspect.

       aspect can be a floating point number string, or a string of the
       form num:den, where num and den are the numerator and denominator
       of the aspect ratio. For example "4:3", "16:9", "1.3333", and
       "1.7777" are valid argument values.
例如,我有两个输入视频:
  • 分辨率为200*400
  • 分辨率为400*700
我需要生成分辨率为100*200的输出视频。
如果我使用-s 100x200运行ffmpeg,则第二个视频将具有错误的宽高比。
如何通过宽度限制输出视频,同时使用正确的高宽比自动计算高度?
例如,我想要指定输出视频仅具有100像素的宽度,并且ffmpeg必须自动计算正确的高宽比来确定高度。
对于第一个视频,将是:
200/100=2
400/2=200
即100x200
对于第二个视频,将是:
400/100=4
700/4=75
即100x75
这是否可能?

有趣的问题——观察ffmpegffprobe输出,你会注意到有SAR和DAR(源/目标宽高比?)。这两者并不相同。例如,我想简单地修复一个宽高比错误的视频,所以我运行了ffmpeg -i input.mp4 -vf setdar=16/10 output.mp4。它不允许使用-c:v copy!然而,当我用mpv播放视频时,它显示:VO: [gpu] 600x480 => 768x480 yuv420p——所以它在播放时被重新调整大小!那么为什么这个操作需要重新编码呢? - Tomasz Gandor
好的,如果有人想知道如何在不重新编码的情况下更改DAR:https://superuser.com/questions/907933/correct-aspect-ratio-without-re-encoding-video-file 叹息。 - Tomasz Gandor
7个回答

27
这条命令是将输入文件通过FFmpeg进行转换,输出文件的宽度为720像素,高度根据16:9的比例自行计算,并将其写入输出文件中。

那个链接已经失效。 - WurmD
4
对于我来说,我必须使用“-vf scale=854x480,setdar=16/9”。将冒号(:)替换为斜杠(/)。 - SuperMar1o
或许ffmpeg又改变了,但截至2023年9月,在Debian上它不再接受"setdar"作为选项。 - undefined

16

使用魔术数字-1按比例调整视频大小,setdar需要使用斜杠/作为分隔符而不是冒号:

ffmpeg -i <input> -vf "scale=100:-1,setdar=16/9" <output>

该命令将按照16:9的宽高比,将视频 200x400 调整为 100x200 以及将视频 400x700 调整为 100x175


我看到很多人在编程中使用“-2”而不是“-1”,但我找不到它们之间的区别。你能否给我提供任何文档或文章来解释一下吗? - TheLebDev
3
-2 确保该维度是2的倍数。同样地,-3 将产生一个3的倍数维度,以此类推。https://trac.ffmpeg.org/wiki/Scaling#KeepingtheAspectRatio - naktinis
2的倍数很重要,因为一些视频容器(如mp4)需要偶数维度。 - ritmatter

14

无法使用于视频。该页面仅处理静态图片。

由于原因尚未完全理解,FFMPEG会通过操作样本/像素宽高比将视频还原回原始宽高比。例如,如果您将视频拉伸为原来的两倍宽度,它会使宽高比变为1:2,或者类似的比例(2:1?)

因此,如果您真的想要像“Stretch Armstrong”一样拉伸视频,您需要强制SAR(样本宽高比):

ffmpeg -i <something> -vf scale=iw*55:ih,setsar=1:1 ...

在FFMPEG手册中没有很好地描述这个问题,这里有一个视频堆栈交流网站的答案,将所有内容都放在了一个地方。


如下所述,下面答案中提供的手册是不正确的,我一直在寻找信息。现在已经找到,请阅读修改后的答案。 - Mark Gerolimatos

2
以下提到两种选项: 带有刻度的:
ffmpeg -i source.mp4 -r 15 -s 320x240 -strict -2 destination.mp4

带有纵横比的:

ffmpeg -i source.mp4 -r 15 -aspect 1:1 -strict -2 destination.mp4

1

我改进了这段代码,可以在不重新编码或转换原始视频的情况下更改宽高比。只需按照以下步骤操作:

ffmpeg -i (Movie name).mp4 -c copy -r 15 -aspect 2.21 -strict -2 (out put Movie name).mp4

在2.21处提到,您可以根据需要将宽高比更改为4.3或16.9。


1

简单的命令可以改变分辨率,但保留原始比例:

ffmpeg -i ogirinal_video.gif -vf scale=800:-1 changed_resolution.gif


0

如果您正在转换具有不同宽高比的纵向和横向方向的视频,则可以使用force_original_aspect_ratio选项:

scale=w=100:h=200:force_original_aspect_ratio=decrease

您可以选择根据纵横比改变force_original_aspect_ratio值来减小或增加视频大小输出。

来源:https://trac.ffmpeg.org/wiki/Scaling


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接