FFMPEG - 在指定的时间间隔内叠加多个视频到视频上

7

我希望能在指定的时间间隔内,将多个视频叠加在单个视频上。

我尝试了不同的解决方案,但并未达到我的预期。

我使用以下命令将视频叠加在视频上:

String[] cmdWorking3 = new String[]{"-i",yourRealPath,"-i",gifVideoFile1,"-i",gifVideoFile2,"-i",gifVideoFile3,
                "-filter_complex",
                "[0][1]overlay=100:100:enable='between(t,0,2)'[v1];" +
                        "[v1][2]overlay=130:130:enable='between(t,0,2)'[v2];" +
                        "[v2][3]overlay=150:150:enable='between(t,5,6)'[v3];",
                "-map","[v3]","-map" ,"0:a",
                "-preset", "ultrafast", filePath};

通过使用上述命令,前两个视频完全正常,但最后一个视频无法启用。 编辑: // 工作完美
 String[] cmdWorking11 = new String[]
                {"-i",
                        yourRealPath,
                        "-i",
                        gifVideoFile1,
                        "-i",
                        gifVideoFile2,
                        "-i",
                        gifVideoFile3,
                        "-i",
                        gifVideoFile4,

                        "-filter_complex",

                        "[1]setpts=PTS+3/TB[1d];" +
                        "[2]setpts=PTS+7/TB[2d];" +
                        "[3]setpts=PTS+10/TB[3d];" +

                        "[0][1]overlay=100:100:enable='between(t,0,2)'[v1];" +
                        "[v1][1d]overlay=130:130:enable='between(t,3,6)'[v2];" +
                        "[v2][2d]overlay=130:130:enable='between(t,7,9)'[v3];" +
                        "[v3][3d]overlay=150:150:enable='between(t,10,13)'[v4];" +

                        "[1]asetpts=PTS+3/TB[1ad];" +
                        "[2]asetpts=PTS+7/TB[2ad];" +
                        "[3]asetpts=PTS+10/TB[3ad];" +
                        "[0:a][1ad][2ad][3ad]amix=4[a]",

                        "-map", "[v4]", "-map", "[a]", "-ac", "5",

                        "-preset",
                        "ultrafast",

                        filePath};

以上命令可以很好地工作,但是叠加视频的音频消失了,你能帮我解决这个问题吗?

主视频的时长约为00:15秒,所有叠加的视频时长约为3秒

如果您能帮忙解决这个问题,那就太好了。谢谢!

2个回答

6
您需要将第三个叠加视频的开始时间延迟到叠加时刻。
String[] cmdWorking3 = new String[]{"-i",yourRealPath,"-i",gifVideoFile1,"-i",gifVideoFile2,"-i",gifVideoFile3,
                "-filter_complex",
                "[3]setpts=PTS+5/TB[3d];" + 
                "[0][1]overlay=100:100:enable='between(t,0,2)'[v1];" +
                        "[v1][2]overlay=130:130:enable='between(t,0,2)'[v2];" +
                        "[v2][3d]overlay=150:150:enable='between(t,5,6)'[v3]",
                "-map","[v3]","-map" ,"0:a",
                "-preset", "ultrafast", filePath};

为了保留音频,请在filter_complex中加入。
          [1]adelay=3000|3000[1ad];
          [2]adelay=7000|7000[2ad];
          [3]adelay=10000|10000[3ad];
          [0:a][1ad][2ad][3ad]amix=5[a]

-map 0:a替换为-map '[a]' -ac 2


它将会崩溃 日志:初始化复杂过滤器时出错。 无效的参数。 - ND1010_
我需要做的是将多个视频叠加在单个视频上, 输入可能包含超过3个。 - ND1010_
我没有理解相同的概念,兄弟。 - ND1010_
为什么需要在最后添加的视频中加入延迟? - ND1010_
你必须为任何叠加视频添加时间延迟,如果它的叠加不是从基础视频的时间0开始。 - Gyan
显示剩余14条评论

1
ffmpeg -i test.mp4  -i test1.mp4 -itsoffset 2 -i test2.mp4  -i test3.mp4 -filter_complex "overlay=0:0,overlay=0:0:enable='between(t,2,15)',overlay=0:0" output.mp4 

其中 -itsoffset 2 表示 test3.mp4 从第2秒开始播放,而 enable='between(t,start_time,end_time)' 则表示该视频的显示时长。


不错 :) 很容易 - Dorian Grv

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