【问题标题】:How do I independently fade in/out multiple (3+) overlay images over video using FFMPEG?如何使用 FFMPEG 在视频上独立淡入/淡出多个 (3+) 叠加图像?
【发布时间】:2019-01-10 00:47:18
【问题描述】:

使用任意源视频,我想在整个视频的不同时间独立淡入/淡出至少三个 .png 覆盖/水印。我无法为过滤器链获取正确的语法。

在下面这些失败的尝试中,我使用了 1920x1080 的四个透明 .png 图像,并使用相同大小的源输入视频。无需缩放/定位,只需在定义的时间淡入和淡出叠加层即可。

我的功能在不褪色的情况下工作,取消“启用”,如下所示:

ffmpeg -i vid1.mp4 -loop 1 -i img1.png -i img2.png -i img3.png -i img4.png -filter_complex 
"overlay=0:0:enable='between(t,8,11)' [tmp];
[tmp]overlay=0:0:enable='between(t,10,15)'[tmp1];
[tmp1]overlay=0:0:enable='between(t,15,138)'[tmp2];
[tmp2]overlay=0:0:enable='between(t,140,150)" 
-c:v libx264 -c:a copy 
-flags +global_header -shortest -s 1920x1080 -y out.mp4

我只想要相同的控制,使用淡入/淡出。

以下几乎可以按我的意愿工作,但我显然不希望整个输出流淡出。我意识到在第 7 行、第 8 行和第 9 行添加淡入淡出会淡化组合输出(从第 7 行开始),但这与我看到每个叠加图像实际淡化的地方一样接近。第 3、4 和 5 行中定义的淡入淡出显然不会影响任何东西,这就是我最初定义它们的地方。当我将它们复制到输出流时,淡入淡出适用于每个叠加图像,但我不希望它影响整个输出流,只影响单个叠加。

ffmpeg -i vid1.mp4 -loop 1 -i img1.png -i img2.png -i img3.png -i img4.png -filter_complex 
    "[1:v]fade=out:st=3:d=1[watermark0]; 
    [2:v]fade=out:st=4:d=1[watermark1]; 
    [3:v]fade=out:st=5:d=1[watermark2]; 
    [4:v]fade=out:st=6:d=1[watermark3]; 
    [0:v][watermark0] overlay=0:0 [tmp0]; 
    [tmp0][watermark1] overlay=0:0,fade=out:st=4:d=1 [tmp1]; 
    [tmp1][watermark2] overlay=0:0,fade=out:st=6:d=1 [tmp2]; 
    [tmp2][watermark3] overlay=0:0,fade=out:st=8:d=1 [out]" -map "[out]" -c:v libx264 -c:a copy 
    -flags +global_header -shortest -s 1920x1080 -y out.mp4

我也尝试过'split',结果与上述类似,但淡入淡出似乎只适用于第一张图像(这个也使用淡入淡出):

ffmpeg -i vid.mp4 -loop 1 -i img1.png -i img2.png -i img3.png -i img4.png -filter_complex 
"[1:v]split=4[wm1][wm2][wm3][wm4]; 
[wm1]fade=in:st=1:d=1:alpha=1,fade=out:st=3:d=1:alpha=1[ovr1]; 
[wm2]fade=in:st=2:d=1:alpha=1,fade=out:st=4:d=1:alpha=1[ovr2]; 
[wm3]fade=in:st=3:d=1:alpha=1,fade=out:st=5:d=1:alpha=1[ovr3]; 
[wm4]fade=in:st=4:d=1:alpha=1,fade=out:st=6:d=1:alpha=1[ovr4]; 
[0:v][ovr1]overlay=0:0[base1]; 
[base1][ovr2]overlay=0:0[base2]; 
[base2][ovr3]overlay=0:0[base3]; 
[base3][ovr4]overlay=0:0[out]" -map "[out]" 
-t 10 -c:v libx264 -c:a copy -flags +global_header -shortest -s 1920x1080 -y out.mp4

非常感谢任何帮助! :)

【问题讨论】:

    标签: ffmpeg video-encoding


    【解决方案1】:

    使用

    ffmpeg -i vid.mp4 -loop 1 -i img1.png -loop 1 -i img2.png -loop 1 -i img3.png
           -loop 1 -i img4.png -filter_complex 
    "[1]fade=st=0:d=1:alpha=1,fade=out:st=2:d=1:alpha=1,trim=0:3,setpts=PTS+12/TB[ovr1]; 
    [2]fade=st=0:d=1:alpha=1,fade=out:st=2:d=1:alpha=1,trim=0:3,setpts=PTS+25/TB[ovr2]; 
    [3]fade=st=0:d=1:alpha=1,fade=out:st=2:d=1:alpha=1,trim=0:3,setpts=PTS+44/TB[ovr3]; 
    [4]fade=st=0:d=1:alpha=1,fade=out:st=2:d=1:alpha=1,trim=0:3,setpts=PTS+73/TB[ovr4]; 
    [0:v][ovr1]overlay=0:0:enable='between(t,12,15)'[base1]; 
    [base1][ovr2]overlay=0:0:enable='between(t,25,28)'[base2]; 
    [base2][ovr3]overlay=0:0:enable='between(t,44,47)'[base3]; 
    [base3][ovr4]overlay=0:0:enable='between(t,73,76)'[out]" -map "[out]" 
    -c:v libx264 -c:a copy -flags +global_header -shortest -s 1920x1080 -y out.mp4
    

    单个图像输入,如果不循环,则被视为一帧的视频输入。我在其他图像中添加了循环。这使得每个输入都是无限期的视频流。

    对于每个图像,都会应用淡入和淡出。对于此处的时间值,假设您在流开始时应用。覆盖的时间偏移稍后发生。淡出后,修剪流以仅在淡出完成之前保留视频。然后应用一个时间偏移来匹配覆盖的开始(要覆盖从 33 秒开始的图像,它是 PTS+33/TB)。

    然后是一系列的叠加层,就像你已经做过的那样。我添加了启用条件以缩短执行时间。

    【讨论】:

    • 这很好用 - 但是我丢失了输出视频中的音频。是否需要单独映射或如何包含主视频的源音频?感谢您的帮助!
    • 是的,添加-map 0:a
    【解决方案2】:

    首先感谢您的回答和代码,它极大地帮助了我修补。我已经发布了我自己的代码(请注意,我不是像你一样的 FFMPEG 专家。) 我的任务是在 20.760 秒的视频中淡入和淡出 3 对标题——标题是透明的 PNG。从您的初始代码中,我执行了以下操作:

    一个。将所有“启用(t,开始,结束)”更改为“启用(t,0,999)”,因此不需要调整或考虑它们(如果您的视频短于 999 秒) 湾。对每个图像使用绝对淡入淡出方法。虽然处理时间较长,但它允许您设置每个标题的绝对结束和开始时间。 C。添加了 -t 20.760,它表示要为其添加标题的基础视频的总长度。这可以防止无限循环。

    ffmpeg -i sourcevideo.mp4 -loop 1 -i servtit1.png -loop 1 -i servtit2.png -loop 1 -i servtit3.png -loop 1 -i servtit4.png -loop 1 -i servtit5.png -loop 1 -i servtit6.png -filter_complex  
    "[1]fade=t=in:st=0.5:d=1,fade=t=out:st=2.5:d=1[ovr1]; 
    [2]fade=t=in:st=2.5:d=1,fade=t=out:st=4.44:d=1[ovr2]; 
    [3]fade=t=in:st=6.8:d=1,fade=t=out:st=9.6:d=1[ovr3]; 
    [4]fade=t=in:st=9.6:d=1,fade=t=out:st=12.4:d=1[ovr4]; 
    [5]fade=t=in:st=12.5:d=1,fade=t=out:st=15.2:d=1[ovr5]; 
    [6]fade=t=in:st=15.2:d=1,fade=t=out:st=17.9:d=1[ovr6]; 
    [0:v][ovr1]overlay=0:0:enable='between(t,0,999)'[base1]; [base1]
    [ovr2]overlay=0:0:enable='between(t,0,999)'[base2]; [base2]
    [ovr3]overlay=0:0:enable='between(t,0,999)'[base3]; [base3]
    [ovr4]overlay=0:0:enable='between(t,0,999)'[base4]; [base4]
    [ovr5]overlay=0:0:enable='between(t,0,999)'[base5]; [base5]
    [ovr6]overlay=0:0:enable='between(t,0,999)'[out]" -map "[out]" -c:v libx264 -c:a copy -flags +global_header -t 20.760 -shortest -y outputvideo.mp4
    

    再次感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 2016-01-22
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 2020-08-13
      • 2015-08-04
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多