淡入淡出与过渡效果
本教程共 32 篇 · 第 27 篇 · 更新于 2026-08-09 · 约 5 分钟阅读
本节目标:会做视频和音频的黑场淡入淡出,会用 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 秒音频交叉淡化,前一段渐弱、后一段渐起,和视频转场同步。
Tipxfade 要求两段视频的参数完全一致。拼接前先统一用
scale、fps、format处理好,能避免大量报错。如果你只需要硬切拼接(没有转场),用 concat demuxer 更快,不需要重编码。xfade 只在需要视觉过渡时才用。