首页 > 解决方案 > 输入区域 0:0:1280:675 不在填充区域 0:0:1280:674 内或大小为零

问题描述

我正在为视频列表设置填充。当分辨率为 854x480 时,它可以工作,当我切换到 1280x720 时,它不起作用。这很可能是因为奇数,如以下问题所述:FFmpeg pad filter calculate wrong width

这是我的原始代码(创建过滤器复杂部分的 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];"

我改变了焊盘宽度和焊盘高度的计算,但错误是一样的。

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_pa​​d_19 @ 0x558b4fe3bb40] 输入区域 0:0:1280:675 不在填充区域 0:0:1280:674 内或大小为零 [Parsed_pa​​d_19 @ 0x558b4fe3bb40] 无法在 Parsed_pa​​d_19 上配置输入板 配置复杂过滤器时出错。无效的论点

我不明白为什么填充区域不是padded area 0:0:1280:720放在首位。我应该在哪里添加 ceil() 或 floor() 函数来完成这项工作?

标签: ffmpegvideo-processing

解决方案


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

... [Parsed_pa​​d_1 @ 0x564355d71aa0] 将 'width' 设置为值 '1280' [Parsed_pa​​d_1 @ 0x564355d71aa0] 将'height' 设置为值 '720' [Parsed_pa​​d_1 @ 0x564355d71aa0] 将'x' 设置为值 'if(lt(in_w,1280 ),(1280-in_w)/2,0)' [Parsed_pa​​d_1 @ 0x564355d71aa0] 将 'height' 设置为值 '0' [Parsed_setsar_2 @ 0x564355b92140] 将 'sar' 设置为值 '1' [Parsed_scale_3 @ 0x564355d7dde0] 设置 'w'到值'1280' [Parsed_scale_3 @ 0x564355d7dde0] 设置'h' 到值'720' [Parsed_scale_3 @ 0x564355d7dde0] 设置'force_original_aspect_ratio' 到值'1' [Parsed_scale_3 @ 0x564355d7dde0] w:1280 h:720 标志: :0 [Parsed_pa​​d_4 @ 0x564355b845a0] 将“宽度”设置为值“1280”[Parsed_pa​​d_4 @ 0x564355b845a0] 将 'height' 设置为值 '720' [Parsed_pa​​d_4 @ 0x564355b845a0] 将'x' 设置为值 'if(lt(in_w,1280),(1280-in_w)/2,0)' [Parsed_pa​​d_4 @ 0x564355b845a ] 将 'height' 设置为 '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选项。


推荐阅读