我的 FFMPEG 命令有点问题,我需要抓取距离底部 20% 处的 2 个像素,然后将其放大以填充从那里到底部的所有内容。
我在用着ffmpeg 版本 4.2.7-0ubuntu0.1
我最初是通过两次导出来实现此目的的(一次创建覆盖层,然后将其放在原始层之上),但这样效率太低了。
但已经让它在一次出口中发挥作用
我当前的命令是:
ffmpeg -i "input.mp4" -filter_complex "\
[0:v]crop=iw:2:0:ih*0.8[cropped];\
[cropped]scale=iw:538,setsar=1:1[bot];\
[0:v][bot]overlay=0:H-(H*0.2)" \
"output.mp4"
正如您在裁剪滤镜中看到的,我确实得到了 2 个像素,然后将其导入缩放滤镜,然后在最后将裁剪和缩放的部分应用到原始视频的顶部。
我可以设置我爱因为它与原始宽度没有变化,但是538这就是令我困扰的事情。
这是我不能使用的地方伊赫*0.2因为价值呃是从 2px 的裁剪滤镜中获取的。
我曾尝试使用多个输入到比例过滤器来获取 [0:v] 的高度,但比例不接受多个输入。
我被建议设置=和表达式=用于在 ffmpeg 内部创建变量,但它们都返回错误(未找到此类过滤器:'set' 和选项 'expr')
那么有没有办法获取并使用比例过滤器内部(就我而言)或过滤器链中间的输入文件的大小?
答案1
要使用原始输入,我们可以使用scale2ref过滤器引用视频输入的大小,而不是规模它只能引用之前的过滤器的输入。
ffmpeg -i "input.mp4" -filter_complex "\
[0:v]crop=iw:2:0:ih*0.8[cropped];\
[cropped][0:v]scale2ref=h=ih*0.2[bot][ref];\
[ref][bot]overlay=0:H-(H*0.2)" \
"output.mp4"
我们首先像原始代码一样进行裁剪,然后使用scale2ref过滤[裁剪]作为我们刚刚裁剪的部分。使用[0:v]作为原始文件输入来引用。然后获取[0:v]我们可以用呃和我爱如果我们想使用[裁剪]那么我们可以使用main_h和main_w。
然后我们在末尾定义输出scale2ref在哪里[机器人]是我们刚刚缩放的部分[裁剪]和[参考]是原始输入[0:v](在我们的例子中保持不变),我们必须使用新创建的输出scale2ref否则将出现未连接输出错误。
然后将缩放后的图像叠加在原始图像上覆盖筛选。