使用FFmpeg实现多个叠加层

3

我正在尝试使用ffmpeg满足构建视频文件的一些分层场景需求。

场景1:在图像上叠加视频(指定视频透明度),创建一个新的视频作为结果。

我用以下命令解决了这个问题:

ffmpeg -i video.mp4 -i image.jpg -filter_complex '[0]format=rgba,colorchannelmixer=aa=0.7,scale=w=3840:h=2160[a];[1][a]overlay=0:0' -t 30 output.mp4

我将视频缩放到3840x2160以匹配我的图像(理想情况下,它们之前应该匹配)。

场景2:现在有3层,视频-图像-图像。中间的图像层是带有文本的透明图像。因此,我们有一个基础图像,上面覆盖了文本,并在其上方以某种透明度放置了视频。

我用以下命令解决了这个问题:

ffmpeg -i video.mp4 -i image.jpg -i text.png -filter_complex '[0]format=rgba,colorchannelmixer=aa=0.7,scale=w=3840:h=2160[a];[2][a]overlay=0:0,scale=w=3840:h=2160[b];[1][b]overlay=0:0' -t 30 output.mp4

场景3(我无法使其正常工作):与场景2相同,但文本在视频上方。

我尝试重新排列过滤器,以影响分层顺序:

ffmpeg -i video.mp4 -i image.jpg -i text.png -filter_complex '[2]overlay=0:0,scale=w=3840:h=2160[a];[0][a]format=rgba,colorchannelmixer=aa=0.7,scale=w=3840:h=2160[b];[1][b]overlay=0:0' -t 5 output.mp4

但是会出现以下错误:

“format”过滤器指定了太多的输入。初始化复杂过滤器时出错。无效参数

完整的错误信息如下:

从'video.mp4'中输入#0,mov,mp4,m4a,3gp,3g2,mj2:
元数据: major_brand:mp42 minor_version:0 compatible_brands:mp42mp41 creation_time:2018-03-09T20:52:18.000000Z 持续时间:00:00:30.00,开始:0.000000,比特率:8002 kb/s 流#0:0(eng):视频:h264(High)(avc1 / 0x31637661),yuv420p(tv,bt709),1920×1080 [SAR 1:1 DAR 16:9],7997 kb/ s,24 fps, 24 tbr,24k tbn,48 tbc(默认) 元数据: creation_time:2018-03-09T20:52:18.000000Z handler_name:Alias Data Handler 编码器:AVC编码输入#1,图像2,来自'image.jpg':持续时间:00:00:00.04,开始:0.000000,比特率:526829 kb/s 流#1:0:视频:mjpeg,yuvj444p(pc,bt470bg / unknown / unknown),3840×2160 [SAR 96:96 DAR 16:9],25 tbr,25 tbn,25 tbc输入#2, 从'text.png'获取png_pipe:持续时间:N / A,比特率:N / A 流#2:0:视频:png,rgba(pc),1500×1500,25 tbr,25 tbn,25 tbc [AVFilterGraph @ 0x7fc37d402de0] “format”过滤器指定了太多的输入。初始化复杂滤波器时出错。无效参数
我可以通过调整命令来绕过这个问题,使得文本不是叠加层的输入:

ffmpeg -i lightTexture.mp4 -i image.jpg -i textSample.png -filter_complex '[2]overlay=0:0,scale=w=3840:h=2160;[0]format=rgba,colorchannelmixer=aa=0.7,scale=w=3840:h=2160[b];[1][b]overlay=0:0' -t 5 output_text_on_top.mp4

但是我的输出视频会混乱。我怀疑我在尝试将所有这些内容塞入-filter_complex时走了错误的方向。我想知道是否需要创建两个覆盖图层,然后覆盖它们(即将文本覆盖到视频上,然后将其覆盖到基本图像上),尽管我不确定如何实现。如果有人能指点我正确的方向,我会非常感激。
1个回答

7

我会跳过缩放部分,因为我假设你会根据需要匹配或缩放。

ffmpeg -i video.mp4 -i image.jpg -i text.png \
 -filter_complex \
    '[0]format=rgba,colorchannelmixer=aa=0.7[v]; \
     [v][2]overlay=0:0[vt]; \
     [1][vt]overlay=0:0' output.mp4

这段文本是覆盖在视频之上,然后再覆盖在图像之上的。


做到了,谢谢!不过我注意到一件事,现在我的 text 图层不再按比例缩放到完整大小了。它在顶部,这是正确的,但由于某种原因,它不再与基础图像的完整大小拉伸,使用 ffmpeg -i video.mp4 -i image.jpg -i text.png -filter_complex '[0]format=rgba,colorchannelmixer=aa=0.7,scale=w=3840:h=2160[v];[v][2]overlay=0:0,scale=w=3840:h=2160[vt];[1][vt]overlay=0:0' -t 5 output.mp4 - lhan
1
你需要先对文本进行缩放。[2]scale=w=3840:h=2160[t]; 然后再进行叠加操作 [v][t]overlay=0:0[vt] - Gyan
啊,是的,搞定了。谢谢! - lhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接