使用ffmpeg

时间:2018-03-23 16:49:58

标签: video ffmpeg

我正在尝试使用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

但是这会产生以下错误:

  

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

完全错误:

  

从'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(高)(avc1 / 0x31637661),yuv420p(tv,bt709),1920x1080 [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:别名数据处理程序   编码器: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输入#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。我想知道我是否需要创建两个叠加然后覆盖它们(即将文本叠加到视频上,然后将其叠加到基本图像上),虽然我不知道如何实现这一点。

如果有人能指出我正确的方向,我会非常感激。

1 个答案:

答案 0 :(得分:2)

我会跳过缩放,因为我假设你会根据需要进行匹配或缩放

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

文字覆盖在视频的顶部,然后叠加在图像上方。