输入区域 0:0:1280:675 不在填充区域 0:0:1280:674 内或大小为零

Input area 0:0:1280:675 not within the padded area 0:0:1280:674 or zero-sized

我正在为视频列表设置填充。当分辨率为 854x480 时,它有效,当我切换到 1280x720 时,它不起作用。这很可能是因为奇数,如这个问题所述:

这是我的原始代码(bash 创建过滤器复杂部分的脚本):

# Resolution
RES_X=1280
RES_Y=720
...
FILTER_COMPLEX_LIST="${FILTER_COMPLEX_LIST}[$i:v]scale=$RES_X:$RES_Y:force_original_aspect_ratio=1,pad=width=$RES_X:height=$RES_Y:x='if(lt(in_w,$RES_X),($RES_X-in_w)/2,0)':0,setsar=1[v$i];"

我改了pad width和pad height的计算方式,还是一样的错误

FILTER_COMPLEX_LIST="${FILTER_COMPLEX_LIST}[$i:v]scale=$RES_X:$RES_Y:force_original_aspect_ratio=1,pad=width=ceil($RES_X/2)*2:height=ceil($RES_Y/2)*2:x='if(lt(in_w,$RES_X),($RES_X-in_w)/2,0)':0,setsar=1$

这是错误:

[Parsed_pad_19 @ 0x558b4fe3bb40] Input area 0:0:1280:675 not within the padded area 0:0:1280:674 or zero-sized [Parsed_pad_19 @ 0x558b4fe3bb40] Failed to configure input pad on Parsed_pad_19 Error configuring complex filters. Invalid argument

我不明白为什么填充区域不是 padded area 0:0:1280:720 首先。 我应该在哪里添加 ceil() 或 floor() 函数以使其工作?

分析日志我意识到这些行:

... [Parsed_pad_1 @ 0x564355d71aa0] Setting 'width' to value '1280' [Parsed_pad_1 @ 0x564355d71aa0] Setting 'height' to value '720' [Parsed_pad_1 @ 0x564355d71aa0] Setting 'x' to value 'if(lt(in_w,1280),(1280-in_w)/2,0)' [Parsed_pad_1 @ 0x564355d71aa0] Setting 'height' to value '0' [Parsed_setsar_2 @ 0x564355b92140] Setting 'sar' to value '1' [Parsed_scale_3 @ 0x564355d7dde0] Setting 'w' to value '1280' [Parsed_scale_3 @ 0x564355d7dde0] Setting 'h' to value '720' [Parsed_scale_3 @ 0x564355d7dde0] Setting 'force_original_aspect_ratio' to value '1' [Parsed_scale_3 @ 0x564355d7dde0] w:1280 h:720 flags:'bilinear' interl:0 [Parsed_pad_4 @ 0x564355b845a0] Setting 'width' to value '1280' [Parsed_pad_4 @ 0x564355b845a0] Setting 'height' to value '720' [Parsed_pad_4 @ 0x564355b845a0] Setting 'x' to value 'if(lt(in_w,1280),(1280-in_w)/2,0)' [Parsed_pad_4 @ 0x564355b845a0] Setting 'height' to value '0' ...

... 这表明,在代码中

FILTER_COMPLEX_LIST="${FILTER_COMPLEX_LIST}[$i:v]scale=$RES_X:$RES_Y:force_original_aspect_ratio=1,pad=width=$RES_X:height=$RES_Y:x='if(lt(in_w,$RES_X),($RES_X-in_w)/2,0)':0,setsar=1[v$i];"

:0 不设置 y 值,而是设置高度值。 (在 x 的设置值之后,接近行尾)。

这很奇怪,因为大部分时间这段代码都没有失败。 在我将此行更改为

之后
FILTER_COMPLEX_LIST="${FILTER_COMPLEX_LIST}[$i:v]scale=$RES_X:$RES_Y:force_original_aspect_ratio=1,pad=width=$RES_X:height=$RES_Y:x='if(lt(in_w,$RES_X),($RES_X-in_w)/2,0)':y=0,setsar=1[v$i];"

有效。

y= 应该还包含一个 lt() 函数来调整内容到中间,但现在它不会失败。 问题是只有部分参数被显式设置,最后一个参数没有,所以ffmpeg按照参数的顺序,所以它把错误的参数设置为0。

感谢 Gyan 介绍 -report 选项。

就我而言,我的图像与其他图像相比尺寸不同。当我删除它时问题就解决了。