如何使用FFmpeg的drawtext滤镜实现文字从右侧滑动至指定位置后静止的效果
如何使用FFmpeg的drawtext滤镜实现文字从右侧滑动至指定位置后静止的效果
咱们可以通过FFmpeg的drawtext滤镜结合动态表达式,轻松实现你想要的“滑动1秒后静止”的文字效果,核心是用条件判断来控制x坐标的变化,完全适配不同帧率和视频分辨率。
核心思路
文字的显示逻辑分为两个阶段:
- 滑动阶段:在文字开始显示的前1秒内,从屏幕右侧完全不可见的位置,匀速滑动到你指定的目标X位置
- 静止阶段:滑动完成后,文字固定在目标X位置,直到显示时间段结束
Y坐标保持你预先计算好的固定值即可。
具体命令示例
假设你的需求是:文字在10-15秒显示,前1秒从右侧滑到屏幕中心(目标X位置),之后静止。视频分辨率为900x1600,目标Y位置为你计算好的target_y,可以用下面的命令:
ffmpeg -i input.mp4 -vf "drawtext=text='你的文字内容':fontsize=24:fontcolor=white:y=target_y:x='if(t - 10 < 1, 900 + text_w - (900 + text_w - (900 - text_w)/2)*(t - 10)/1, (900 - text_w)/2)':enable='between(t,10,15)'" -c:a copy output.mp4
命令参数详解
咱们拆解一下关键部分:
x坐标的动态表达式:
t - 10 < 1:判断当前时间是否处于文字开始显示后的1秒内(10是文字开始显示的时间)900 + text_w:文字的初始X位置,让文字完全处于屏幕右侧外(900是视频宽度),确保一开始看不到(900 + text_w - (900 - text_w)/2)*(t - 10)/1:线性计算滑动的距离,1秒内从初始位置匀速移动到屏幕中心((900 - text_w)/2是屏幕中心的X坐标,自动减去文字宽度避免文字偏右)- 当超过1秒后,x直接固定为目标位置
(900 - text_w)/2
enable参数:
enable='between(t,10,15)'确保文字只在10-15秒这个时间段内显示适配不同场景:
- 如果你的目标X位置不是中心,把
(900 - text_w)/2换成你预先计算好的target_x即可 - 要适配不同分辨率,把
900换成内置变量w(代表视频宽度),比如:x='if(t - 10 < 1, w + text_w - (w + text_w - target_x)*(t - 10)/1, target_x)' - 换其他显示时间段(比如12-25秒),只需要把
10换成开始时间12,enable参数改成between(t,12,25)就行
- 如果你的目标X位置不是中心,把
注意事项
text_w是drawtext滤镜的内置变量,会自动计算当前文字的宽度,不用手动输入- 帧率不用额外适配,因为表达式里的
t是基于秒的时间,FFmpeg会自动处理不同帧率的视频
备注:内容来源于stack exchange,提问作者Smith Kumar




