ffmpeg仅对部分视频使用带有alphamerge的complex_filter

时间:2019-03-07 11:42:41

标签: filter ffmpeg

我正在尝试仅对视频剪辑的前几秒钟应用过滤器-并使其余视频保持不变。

为什么? 我有一些要放在网站上的视频剪辑-不幸的是,这些剪辑以黑色背景开头,不适合该网站的设计。因此,我将背景更改为透明。

我从这里的许多好答案(感谢Gyan)得到了这个过滤器,并且这些视频在常见的浏览器中都可以正常播放:

ffmpeg -i ${1} -filter_complex "[0]split[m][a];
[a]geq='if(lt(lum(X,Y),16),0,255)',hue=s=0[al];
[m][al]alphamerge,format=yuva420p" -c:v libvpx-vp9 -b:v 0 -crf 18 -an -auto-alt-ref 0 ${1}.webm
现在是问题:当然,这会替换视频中的所有黑色像素,这会在以后导致许多伪像。因此,我正在寻找一种仅将过滤器应用到前5秒钟的方法。

我想我需要第二次拆分,裁剪或修剪以及带有时间戳的concat过滤器-但我无法使其工作:(

ffmpeg -i ${1} -filter_complex "[0]split[f][s];
[f]trim=start=0,duration=5[ft];
[s]trim=start=6[st];
[st]split[m][a];
[a]geq='if(lt(lum(X,Y),16),0,255)',hue=s=0[al];
[m][al]alphamerge,format=yuva420p[mal];
[ft][mal]concat" -c:v libvpx-vp9 -b:v 0 -crf 18 -an -auto-alt-ref 0 ${1}.webm

/ edit:我正在稍微更改主题以反映实际问题。

1 个答案:

答案 0 :(得分:1)

使用

ffmpeg -i ${1} -filter_complex "[0]split[m][a]; [a]geq='if(lt(lum(X,Y),16),0,255)',hue=s=0,drawbox=c=white:t=fill:enable='gte(t,6)'[al]; [m][al]alphamerge,format=yuva420p" -c:v libvpx-vp9 -b:v 0 -crf 18 -an -auto-alt-ref 0 ${1}.webm

由于我们要添加Alpha平面,因此必须将其添加到所有帧中。我们只想在特定点之后跳过透明度,因此在与主视频合并之前,我们使用画框过滤器从6秒开始用白色填充透明度。