You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 15:20:46