ffmpeg:如何放置多个覆盖层并正确淡出最顶层

ffmpeg:如何放置多个覆盖层并正确淡出最顶层

我尝试将多个叠加层叠加在一起,并在几帧之后淡出最上面的内容。因此,我使用了 2 个 .png 文件,应按以下顺序放置在最终视频中:

fademe.png <-- 最顶层的覆盖,应该在某些帧之后淡出

overlay.png <-- 第二个覆盖,始终可见

movie.mov <- 以电影为底层

我正在使用此代码从覆盖层创建 PNG 编码的 .mov:

ffmpeg -y -loop 1 -i fademe.png -loop 1 -i overlay.png -filter_complex "[0:0]fade=out:25:25[fad];[1:0][fad] overlay" -vframes 55 -vcodec png overlay.mov

然后我使用 ffmbc 将 overlay.mov 放在另一个视频之上。

(我使用 ffmbc 因为最终输出将是 ProRes4444)

ffmbc -y -threads 0 -i movie.mov -vf "movie=overlay.mov [watermark]; [in][watermark] overlay [out]"  -vcodec libx264 faded.mp4

输出视频看起来不错,直到开始褪色并且fademe.png [fad]似乎褪色为白色并且对下面的颜色产生一些奇怪的影响,直到它消失。

overlay当我将最后的顺序更改为时[1:0][fad] overlay[fad][1:0] overlay它看起来像这样:

ffmpeg -y -loop 1 -i fademe.png -loop 1 -i overlay.png -filter_complex "[0:0]fade=out:25:25[fad];[fad][1:0] overlay" -vframes 55 -vcodec png overlay.mov

褪色看起来正确,但overlay.png [1:0]不应该是最顶层。

我猜测第一次尝试时 alpha 通道可能出了问题。

关于如何解决这个问题有什么建议吗?

答案1

没有必要使用两个命令并创建带有 alpha 通道的中间文件。带有 3 个输入、2 个叠加滤镜和一个淡入淡出滤镜的单个命令alpha=1应该可以做到这一点:

ffmpeg -y -i movie.mov -loop 1 -i overlay.png -loop 1 -i fademe.png \
-filter_complex '[0:v][1:v] overlay [V1]; \
[2:v] fade=out:25:25:alpha=1 [V2]; [V1][V2] overlay' \
faded.mp4

答案2

我想我找到了一个解决方案:

首先,我制作了一个逐渐褪色的标志的中间视频

ffmpeg -y -loop 1  -i fademe.png -filter_complex "fade=out:25:25" -vframes 55 -vcodec png fademe.mov

然后我使用这个命令和 ffmbc

ffmbc -i movie.mov -vf "movie=overlay.png [over]; movie=fademe.mov [fade]; [in][over] overlay [inter]; [inter][fade] overlay [out]" -vcodec libx264 out.mp4

...嘿尤里卡!!!

位于作品顶部的标志正在顺利地消失!

相关内容