FFMPEG - 以特定的时间间隔在视频上叠加多个视频

Posted

技术标签:

【中文标题】FFMPEG - 以特定的时间间隔在视频上叠加多个视频【英文标题】:FFMPEG - Overlay multipe videos over video at specified interval of time 【发布时间】:2018-08-28 00:26:18 【问题描述】:

我想以指定的时间间隔在一个视频上叠加多个视频。

尝试了不同的解决方案,但它不会像我一样工作

我使用下面的命令在视频上叠加视频

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秒

很高兴能帮助解决这个问题,在此先感谢。

【问题讨论】:

【参考方案1】:

您需要延迟第三个叠加视频在叠加时开始。

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

【讨论】:

它会崩溃 日志:初始化复杂过滤器时出错。无效参数 [AVFilterGraph @ 0xf26d4740] 没有这样的过滤器:''初始化复杂过滤器时出错。无效参数 我需要做的是在单个视频上叠加多个视频,输入可能包含超过 3 个 我不明白同一个兄弟的概念 为什么要延迟最后添加的视频?【参考方案2】:
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 2s 开始播放, enable='between(t,start_time,end_time)' 表示此视频显示时长

【讨论】:

以上是关于FFMPEG - 以特定的时间间隔在视频上叠加多个视频的主要内容,如果未能解决你的问题,请参考以下文章

使用 FFMPEG 以最少的重新编码添加覆盖

使用 FFmpeg 将音频输入与视频混合到特定位置

来自 Android 的视频叠加

ffmpeg如何在视频上放置颜色叠加

FFmpeg - 将一个视频叠加到另一个视频上?

叠加两个视频时的音频问题 (ffmpeg)