【问题标题】:Multiple overlays using ffmpeg使用 ffmpeg 的多个叠加层
【发布时间】:2018-03-23 16:49:58
【问题描述】:

我正在尝试满足一些使用 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

但这会产生以下错误:

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

完全错误:

输入#0,mov,mp4,m4a,3gp,3g2,mj2,来自“video.mp4”:
元数据: 主要品牌:mp42 次要版本:0 兼容品牌:mp42mp41 创建时间:2018-03-09T20:52:18.000000Z

时长:00:00:30.00,开始:0.000000,比特率:8002 kb/s

流 #0:0(eng):视频:h264(高)(avc1 / 0x31637661)、yuv420p(tv、bt709)、1920x1080 [SAR 1:1 DAR 16:9]、7997 kb/s、24 fps , 24 tbr、24k tbn、48 tbc(默认)

元数据: 创建时间:2018-03-09T20:52:18.000000Z handler_name : 别名数据处理程序 编码器:AVC编码输入#1,image2,来自'image.jpg':

时长:00:00:00.04,开始:0.000000,比特率:526829 kb/s

流 #1:0:视频:mjpeg、yuvj444p(pc, bt470bg/unknown/unknown), 3840x2160 [SAR 96:96 DAR 16:9], 25 tbr, 25 tbn, 25 tbc Input #2, png_pipe,来自“text.png”:持续时间:N/A,比特率:N/A

流 #2:0:视频:png、rgba(pc)、1500x1500、25 tbr、25 tbn、25 tbc [AVFilterGraph @ 0x7fc37d402de0]

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

我可以通过调整命令来解决这个问题,以便文本不是叠加层的输入:

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 是走错了路。我想知道是否需要创建两个叠加层,然后将它们叠加(即将文本叠加到视频上,然后将其叠加到基础图像上),尽管我不确定如何实现。

如果有人能在这里指出正确的方向,我将非常感激。

【问题讨论】:

    标签: video ffmpeg


    【解决方案1】:

    我将跳过缩放,因为我假设您会根据需要匹配或缩放

    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 拉伸到基本图像的完整大小
    • 您需要事先对文本进行缩放。 [2]scale=w=3840:h=2160[t]; 然后[v][t]overlay=0:0[vt]
    • 啊,是的。谢谢!
    猜你喜欢
    • 2017-10-16
    • 1970-01-01
    • 2021-02-21
    • 2021-09-02
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    相关资源
    最近更新 更多