首页 / FFmpeg 入门教程 / 淡入淡出与过渡效果

FFmpeg 入门教程

淡入淡出与过渡效果

本教程共 32 篇 · 第 27 篇 · 更新于 2026-08-09 · 约 5 分钟阅读

FFmpegfadexfade淡入淡出转场afade过渡

本节目标:会做视频和音频的黑场淡入淡出,会用 xfade 在两段视频之间加转场效果,知道淡入淡出的开始时间怎么算。

淡入淡出是最朴素也最常用的画面效果:视频开头从黑场渐入,结尾淡出到黑场;音频从静音渐起,结尾渐弱。FFmpeg 用 fade(视频)和 afade(音频)各管一摊,视频之间的转场则用 xfade

一、视频 fade:淡入淡出

淡入(fade in)

ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=2" output.mp4
  • t=in:淡入(从黑变亮)
  • st=0:从第 0 秒开始(start time)
  • d=2:持续 2 秒(duration)

效果:视频前 2 秒从黑屏渐变到正常画面。

淡出(fade out)

ffmpeg -i input.mp4 -vf "fade=t=out:st=58:d=2" output.mp4

从第 58 秒开始,2 秒内渐变到黑屏。

起始时间怎么算

淡出的 st 应该是”视频总时长 − 淡出时长”。比如 60 秒视频,做 2 秒淡出,就从第 58 秒开始。

不知道视频时长时,用 ffprobe 查:

ffprobe -v error -show_entries format=duration -of csv=p=0 input.mp4

颜色不是黑色?

默认淡入到黑场、淡出到黑场。想淡到白色:

ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=2:color=white" output.mp4

color 支持颜色名(black/white/red)或十六进制色值(0xRRGGBB)。

同时加淡入淡出

一条滤镜链里串联两个 fade:

ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=2,fade=t=out:st=58:d=2" output.mp4

前 2 秒淡入,第 58 秒淡出。

二、音频 afade:声音淡入淡出

音频用 afade,参数和 fade 几乎一样,但类型用 t 指定:

ffmpeg -i input.mp3 -af "afade=t=in:st=0:d=3" output.mp3

音频淡入(从静音到正常音量):

  • t=in:淡入
  • st=0:开始时间
  • d=3:持续 3 秒

淡出:

ffmpeg -i input.mp3 -af "afade=t=out:st=177:d=3" output.mp3

音视频一起淡入淡出

ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=2,fade=t=out:st=58:d=2" \
  -af "afade=t=in:st=0:d=2,afade=t=out:st=58:d=2" output.mp4

画面和声音同步淡入淡出。

三、drawtext 文字淡入淡出

第 25 章讲了 drawtext 写字。如果想让文字也有淡入淡出效果,用 alpha 表达式:

ffmpeg -i input.mp4 -vf \
  "drawtext=text='码上学':fontsize=48:fontcolor=white:x=40:y=40:\
alpha='if(lt(t,1),0,if(lt(t,2),(t-1)/1,if(lt(t,5),1,if(lt(t,6),1-(t-5),0))))'" \
  output.mp4

逻辑拆解:

  • 0–1 秒:alpha=0(透明)
  • 1–2 秒:alpha 从 0 渐变到 1(淡入)
  • 2–5 秒:alpha=1(完全显示)
  • 5–6 秒:alpha 从 1 渐变到 0(淡出)
  • 6 秒后:透明

表达式比较长,但本质就是分段函数。把它当作模板套用即可。

四、xfade:两段视频之间的转场

xfade 是 FFmpeg 4.3 以后加入的视频转场滤镜,可以在两段视频之间做溶解、擦除、滑动等效果。

基础用法

两段视频拼接,默认是硬切。加 xfade 可以做 1 秒交叉溶解:

ffmpeg -i clip1.mp4 -i clip2.mp4 -filter_complex \
  "[0:v][1:v]xfade=transition=fade:duration=1:offset=4[v]" \
  -map "[v]" output.mp4
  • transition=fade:溶解效果(默认)
  • duration=1:转场持续 1 秒
  • offset=4:从第一段视频的第 4 秒开始转场

offset 必须等于第一段视频时长 − 转场时长。比如第一段 5 秒、转场 1 秒,offset 就是 4。两段视频需要分辨率、帧率、像素格式一致,否则要先统一:

ffmpeg -i clip1.mp4 -i clip2.mp4 -filter_complex \
  "[0:v]scale=1280:720,fps=30,format=yuv420p[v0]; \
   [1:v]scale=1280:720,fps=30,format=yuv420p[v1]; \
   [v0][v1]xfade=transition=fade:duration=1:offset=4[v]" \
  -map "[v]" output.mp4

常用转场类型

xfade 支持几十种 transition,常用的有:

transition效果
fade交叉溶解(最常用)
fadeblack先黑场再亮
fadewhite先白场再亮
wipeleft / wiperight左右擦除
slideleft / slideright滑动覆盖
circleopen / circleclose圆形展开/收缩
dissolve颗粒溶解
pixelize像素化过渡

查看全部:

ffmpeg -h filter=xfade

三段以上拼接

多段视频需要多次 xfade,每次 offset 要累加:

ffmpeg -i a.mp4 -i b.mp4 -i c.mp4 -filter_complex \
  "[0:v][1:v]xfade=transition=fade:duration=1:offset=4[x1]; \
   [x1][2:v]xfade=transition=wipeleft:duration=1:offset=8[v]" \
  -map "[v]" output.mp4

假设每段 5 秒:第一次 xfade 在第 4 秒,转场后总长 9 秒(5+5−1);第二次 offset 就是 9−1=8。多段拼接时 offset 计算要小心,最好用脚本算。

五、音频交叉淡化

视频做了 xfade,音频也要对应交叉淡化,用 acrossfade

ffmpeg -i clip1.mp4 -i clip2.mp4 -filter_complex \
  "[0:v][1:v]xfade=transition=fade:duration=1:offset=4[v]; \
   [0:a][1:a]acrossfade=d=1[a]" \
  -map "[v]" -map "[a]" output.mp4

acrossfade=d=1 表示 1 秒音频交叉淡化,前一段渐弱、后一段渐起,和视频转场同步。

Tip

xfade 要求两段视频的参数完全一致。拼接前先统一用 scalefpsformat 处理好,能避免大量报错。如果你只需要硬切拼接(没有转场),用 concat demuxer 更快,不需要重编码。xfade 只在需要视觉过渡时才用。