使用 libav 过滤器缩放视频时出错 [重复]

Posted

技术标签:

【中文标题】使用 libav 过滤器缩放视频时出错 [重复]【英文标题】:Error scaling a video using libav filters [duplicate] 【发布时间】:2013-04-30 06:25:33 【问题描述】:

我需要对一堆视频进行批处理,以将它们的高度缩放到 240,同时保持纵横比不变。让工作几乎完成的命令是:

$ avconv -threads 4 -ss 0.0 -i input.avi \
-map 0:0,0:0 -map 0:1,0:1 -vf "scale=-1:240" -y -f mpegts \
-async -1 -vcodec libx264 -vcodec libx264 -flags2 +fast \
-flags +loop -g 30 -bufsize 1024k \
-b 200k -bt 220k -qmax 48 -qmin 2 -r 20 -acodec libmp3lame \
-ab 44k -ar 44100 -ac 2 output.ts

如您所见,有趣的部分是-vf "scale=-1:240"

这适用于缩放后的输出宽度为偶数的视频。否则,我会收到以下错误消息:

[libx264 @ 0x7fc4f8821e00] width not divisible by 2 (341x240)

我该如何克服这个问题?

编辑: 根据这个link,我尝试使用-vf "scale=trunc(oh/a/2)*2:240" 输出电影,但生成的视频质量真的很差。

编辑#2: 这不是重复的,因为它被错误地标记了。这个问题比另一个问题更早发布。

【问题讨论】:

至于重复,哪个问题较旧并不重要。通常,投票数较少的问题会被标记为重复问题。 @LordNeckbeard 这也有道理,但与上面框中的 SO 自己的定义相矛盾,特别是 - “标记为重复......这个问题之前已经被问过并且已经有了答案”。 其目的是了解 SO 的指导方针,而不是争论谁是第一个。但如果听起来是这样,我就停在这里。 【参考方案1】:

更新;您现在可以使用:

-vf scale=-2:240

Is there a good list of mp4 supported resolutions and a way to have ffmpeg calculate the width after modifying by set height ratio?


链接实际上说:

scale="854:trunc(ow/a/2)*2"

如果您想缩放高度,它会正确地将高度缩放为偶数 宽度你必须使用这个成语:

-vf scale="trunc(oh*a/2)*2:240"
#                  ^
#                 /
#       notice ---

背后的数学:

iw   ow
-- = --
ih   oh

ow = (iw * oh) / ih
ow = oh * a

【讨论】:

这些缩写代表什么? @StevenPenny 完全正确。当然,纵横比需要相乘而不是除。谢谢

以上是关于使用 libav 过滤器缩放视频时出错 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

删除视频的某些部分并重新制作关键帧(c++ + libav)

Libav(ffmpeg)将解码的视频时间戳复制到编码器

使用libav编码时根据经过时间计算帧PTS

在 c++ 中以可变帧速率使用 FFmpeg 库(不是 libav 分支)以编程方式捕获视频

使用 ffmpeg libav 和 libx264 从图像创建视频?

ffmpeg实现视频转gif及gif缩放(ffmpeg4.2.2)