如何在ffmpeg filter_complex中为视频网格添加带淡入淡出的定时文字
问题场景
我正在使用以下FFmpeg filter_complex 命令生成4K视频网格:
ffmpeg -i v_nimble_guardian.mkv -i macko_nimble_guardian.mkv -i ghost_nimble_guardian_1.mp4 -i nano_nimble_guardian.mkv -filter_complex " nullsrc=size=3840x2160 [base]; [0:v] trim=start=39.117000,setpts=PTS-STARTPTS, scale=1920x1080 [upperleft]; [1:v] trim=start=40.483000,setpts=PTS-STARTPTS, scale=1920x1080 [upperright]; [2:v] trim=start=32.416471,setpts=PTS-STARTPTS, scale=1920x1080 [lowerleft]; [3:v] trim=start=28.100000,setpts=PTS-STARTPTS, scale=1920x1080 [lowerright]; [3:a] atrim=start=28.100000,asetpts=PTS-STARTPTS[outa]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=1920 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=1080 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=1920:y=1080[v] " -map "[v]" -map "[outa]" -c:v libx264 -crf 17 -shortest -t 880 output4k.mkv
我希望为该视频网格添加一段文字,要求文字在第10秒淡入,持续显示30秒后淡出。尝试了以下命令:
ffmpeg -i v.mkv -i macko_nimble_guardian.mkv -i ghost_nimble_guardian_subtle_arrow_1.mp4 -i nano_nimble_guardian.mkv -filter_complex " nullsrc=size=1920x1080 [base]; drawtext=text='Summer Video':enable='between(t,10,30)'[fg]; [0:v] trim=start=39.117000,setpts=PTS-STARTPTS, scale=960x540 [upperleft]; [1:v] trim=start=40.483000,setpts=PTS-STARTPTS, scale=960x540 [upperright]; [2:v] trim=start=32.416471,setpts=PTS-STARTPTS, scale=960x540 [lowerleft]; [3:v] trim=start=28.100000,setpts=PTS-STARTPTS, scale=960x540 [lowerright]; [3:a] atrim=start=28.100000,asetpts=PTS-STARTPTS[outa]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=960 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=540 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=960:y=540[v] " -map "[v]" -map "[outa]" -c:v libx264 -shortest -t '30' output2.mkv
但出现错误:
[Parsed_drawtext_1 @ 0x600002bdc420] Using "/System/Library/Fonts/Supplemental/Verdana.ttf" Filter drawtext:default has an unconnected output
错误原因
你创建的drawtext滤镜输出[fg]没有和后续的滤镜链连接,FFmpeg不允许存在未连接的滤镜输出节点,因此报错。另外原命令里的enable='between(t,10,30)'只能控制文字显示时间段,无法实现淡入淡出效果,需要额外通过透明度表达式实现。
正确实现命令
以下是基于你原始4K网格需求的完整命令,实现文字10秒开始淡入(1秒完成淡入)、显示到40秒后开始淡出(1秒完成淡出),总显示时长30秒:
ffmpeg -i v_nimble_guardian.mkv -i macko_nimble_guardian.mkv -i ghost_nimble_guardian_1.mp4 -i nano_nimble_guardian.mkv -filter_complex " nullsrc=size=3840x2160 [base]; [0:v] trim=start=39.117000,setpts=PTS-STARTPTS, scale=1920x1080 [upperleft]; [1:v] trim=start=40.483000,setpts=PTS-STARTPTS, scale=1920x1080 [upperright]; [2:v] trim=start=32.416471,setpts=PTS-STARTPTS, scale=1920x1080 [lowerleft]; [3:v] trim=start=28.100000,setpts=PTS-STARTPTS, scale=1920x1080 [lowerright]; [3:a] atrim=start=28.100000,asetpts=PTS-STARTPTS[outa]; # 构建视频网格 [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=1920 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=1080 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=1920:y=1080[grid]; # 添加带淡入淡出的文字 [grid] drawtext=text='Summer Video':fontsize=60:fontcolor=white:alpha='if(lt(t,10),0,if(lt(t,11),(t-10)/1,if(lt(t,40),1,if(lt(t,41),(41-t)/1,0))))':x=(w-text_w)/2:y=(h-text_h)/2[v]; " -map "[v]" -map "[outa]" -c:v libx264 -crf 17 -shortest -t 880 output4k_with_text.mkv
关键说明
- 滤镜链连接:先完成视频网格的合成为
[grid],再将其作为drawtext的输入,确保所有滤镜节点都连接成完整链路,避免未连接输出的错误。 - 淡入淡出实现:通过
alpha表达式控制文字透明度:lt(t,10):10秒前透明度为0(隐藏)lt(t,11):10-11秒线性淡入(透明度从0到1)lt(t,40):11-40秒保持完全显示(透明度1)lt(t,41):40-41秒线性淡出(透明度从1到0)- 超出41秒后透明度回到0
- 文字位置:
x=(w-text_w)/2:y=(h-text_h)/2将文字居中显示,可根据需求调整坐标。 - 字体参数:可添加
fontfile=/path/to/your/font.ttf指定自定义字体,调整fontsize、fontcolor等参数优化显示效果。
内容的提问来源于stack exchange,提问作者PirateApp
相关产品推荐
相关产品推荐

