ffmpeg - 输入区域 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_pad_19 @ 0x558b4fe3bb40] 输入区域 0:0:1280:675 不在填充区域 0:0:1280:674 内或大小为零 [Parsed_pad_19 @ 0x558b4fe3bb40] 无法在 Parsed_pad_19 上配置输入板 配置复杂过滤器时出错。无效的论点
我不明白为什么填充区域不是padded area 0:0:1280:720
放在首位。我应该在哪里添加 ceil() 或 floor() 函数来完成这项工作?
解决方案
分析日志我意识到这些行:
... [Parsed_pad_1 @ 0x564355d71aa0] 将 'width' 设置为值 '1280' [Parsed_pad_1 @ 0x564355d71aa0] 将'height' 设置为值 '720' [Parsed_pad_1 @ 0x564355d71aa0] 将'x' 设置为值 'if(lt(in_w,1280 ),(1280-in_w)/2,0)' [Parsed_pad_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_pad_4 @ 0x564355b845a0] 将“宽度”设置为值“1280”[Parsed_pad_4 @ 0x564355b845a0] 将 'height' 设置为值 '720' [Parsed_pad_4 @ 0x564355b845a0] 将'x' 设置为值 'if(lt(in_w,1280),(1280-in_w)/2,0)' [Parsed_pad_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选项。
推荐阅读
- c# - Visual Studio 2017 Express“删除”PC重启后所有Methods的摘要
- javascript - R闪亮:如何将变量写入cookie
- html - 如何使内容从上到下自动滚动并备份?
- three.js - WebGL(Three.js)`警告:顶点着色器'flakeUv'的输出未由片段着色器`警告和`flakeScale`读取
- git - 在 git 中创建补丁集的步骤是什么
- java - 无法启动活动组件信息 [使用 Intent 在“活动”之间移动]
- algorithm - 给定一个网络 N 和一条边 (x, y) ∈ E,确定边是否穿过 N 的每个 mincut 的最佳算法是什么
- html - HTML5 输入范围滑块步长,如 5 10 25 50 100 1000
- css - 创建具有有限标准 CSS 属性的圆形图像?
- php - 更改 auth_redirect() 页面