FFmpeg - 使用纵横比更改视频的分辨率

Posted

技术标签:

【中文标题】FFmpeg - 使用纵横比更改视频的分辨率【英文标题】:FFmpeg - Change resolution of the video with aspect ratio 【发布时间】:2014-07-28 01:02:58 【问题描述】:

全部。

如何使用 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,那么第二个视频的宽高比会很差。

如何按宽度限制输出视频,按高度自动宽高比?

例如,我想为输出视频仅指定宽度 100px 并且 ffmpeg 必须自动计算具有正确纵横比的高度。

对于第一个视频,它将是:

200/100=2

400/2=200

即100x200

第二个视频是:

400/100=4

700/4=75

即 100x75

有可能吗?

【问题讨论】:

有趣的问题 - 查看ffmpegffprobe 输出,您会注意到存在SAR 和DAR(源/目标纵横比?)。这些不是一回事。例如。我只想用错误的 AR 修复视频,所以我运行了ffmpeg -i input.mp4 -vf setdar=16/10 output.mp4。它不想允许-c:v copy!然而,当我用mpv 播放视频时,有:VO: [gpu] 600x480 => 768x480 yuv420p - 所以它在播放时被调整大小!那么为什么这个操作需要重新编码呢? 好的,如果有人想知道如何在不重新编码的情况下更改 DAR:superuser.com/questions/907933/…sigh. 【参考方案1】:

如果您要转换具有不同纵横比的纵向和横向视频,您可以使用 force_original_aspect_ratio 选项:

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

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

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

【讨论】:

【参考方案2】:

更改分辨率的简单命令,但保持原始外观: (本例改为 800 宽度)

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

【讨论】:

【参考方案3】:

ffmpeg -i <input> -vf scale=720x406,setdar=16:9 <output>

【讨论】:

那个链接坏了 对我来说,我必须使用-vf scale=854x480,setdar=16/9。 '/' 而不是 ':'【参考方案4】:

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

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

该命令会将视频200x400 调整为100x200400x700 调整为100x175,纵横比为16:9

【讨论】:

我读过很多人们使用-2 而不是-1。我找不到区别。您能否将我链接到任何可以解释它的文档或文章? @TheLebDev, -1 将告诉ffmpeg 自动选择与提供的宽度相关的正确高度(ffmpeg.org/ffmpeg-filters.html#toc-Examples-98) @TheLebDev -2 将确保维度是 2 的倍数。类似地,-3 将产生一个维度是 3 的倍数,依此类推。 trac.ffmpeg.org/wiki/Scaling#KeepingtheAspectRatio【参考方案5】:

下面提到两个选项: 有规模:

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

【讨论】:

【参考方案6】:

不适用于视频。该页面仅处理静止图像。

由于尚未完全理解的原因,FFMPEG 使用 Sample/Pixel Aspect Ratio 将视频转回原始纵横比。例如,如果您将视频拉伸两倍宽,它会使宽高比为 1:2,或类似的东西 (2:1?)

因此,如果您真的想将视频拉伸为“Stretch Armstrong”样式,则需要强制 SAR(Sample Aspect Ratio):

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

FFMPEG 手册中没有很好地描述这一点,here's a video.stackexchange answer that puts it all in one place.

【讨论】:

如前所述,以下答案中提供的手册不正确,我正在继续查找信息。既然找到了,请阅读修改后的答案。

以上是关于FFmpeg - 使用纵横比更改视频的分辨率的主要内容,如果未能解决你的问题,请参考以下文章

使用 ffmpeg sameq 和编解码器副本更改纵横比

即使匹配视频大小和预览大小纵横比,MediaRecorder 也会失败

两种纵横比(4:3 和 16:9)的两种布局 - 自动更改

为啥传感器尺寸的纵横比和图像分辨率的纵横比不同?

多种屏幕分辨率/纵横比(游戏)

如何在 React Native 中设置 Android 屏幕、分辨率、纵横比和大小?