FFmpeg技术需求:拼接3个视频并实现画中画叠加效果
FFmpeg实现复杂视频拼接与画中画转场方案
步骤1:自动计算转场触发时间
先通过ffprobe获取mainvideo.mp4的时长,以此算出结束前20秒的转场触发点:
main_duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 mainvideo.mp4) overlay_start=$(echo "$main_duration - 20" | bc)
如果自动计算有问题,直接手动指定overlay_start为具体秒数即可(比如overlay_start=100)。
步骤2:完整FFmpeg命令
以下命令一次性完成所有需求:将intro拼至开头、结束前20秒触发画中画转场、全程保留main的音频:
ffmpeg -i intro.mp4 -i mainvideo.mp4 -i endboard.mp4 \ -filter_complex " # 统一intro视频分辨率(与mainvideo匹配,可按需修改scale参数) [0:v]scale=iw:ih[v_intro]; # 切割mainvideo为两部分:转场前的全画面段、转场后的画中画段 [1:v]trim=0:${overlay_start},setpts=PTS-STARTPTS[v_main_part1]; [1:v]trim=${overlay_start}:${main_duration},setpts=PTS-STARTPTS,scale=320:240[v_main_pip]; # 处理endboard视频时序 [2:v]setpts=PTS-STARTPTS[v_endboard]; # 拼接intro与main的前半段视频 [v_intro][v_main_part1]concat=n=2:v=1:a=0[v_concat_part1]; # 叠加endboard(主画面)与main的画中画(左上角偏移20px) [v_endboard][v_main_pip]overlay=x=20:y=20[v_overlay]; # 拼接前半段与转场后的叠加片段 [v_concat_part1][v_overlay]concat=n=2:v=1:a=0[v_final]; # 提取mainvideo的完整音频作为输出音频 [1:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a_final] " \ -map "[v_final]" -map "[a_final]" -c:v libx264 -c:a aac output.mp4
参数调整说明
- 画中画定制:
scale=320:240是画中画的尺寸,x=20:y=20是画中画的左上角位置,可根据需求修改数值。 - intro音频处理:如果需要保留intro的音频,可将音频滤镜改为
[0:a][1:a]concat=n=2:v=0:a=1[a_final],但这会导致main的音频在intro播放结束后才开始,不符合“全程保留main音频”的需求,按需选择。 - endboard时长不足:如果endboard时长小于20秒,可添加循环滤镜让其持续播放,把
[2:v]setpts=PTS-STARTPTS[v_endboard]改为[2:v]loop=loop=-1:size=1,setpts=PTS-STARTPTS[v_endboard]即可。 - 分辨率统一:如果三个视频分辨率不一致,需把
scale参数改为统一的目标分辨率(比如scale=1920:1080),避免拼接出错。
内容的提问来源于stack exchange,提问作者3EK
相关产品推荐
相关产品推荐

