FFmpeg实现四种对角方向drawtext文字滑动动画的命令求助
Hi Raymond,我来帮你搞定这四个方向的文字滑动动画,先给你捋清楚drawtext滤镜里几个关键变量的意思,这样你以后也能自己调整:
w:视频的宽度h:视频的高度tw:当前绘制文字的宽度th:当前绘制文字的高度t:视频播放的时间(单位:秒)
你的原命令问题出在没把文字的自身尺寸(tw/th)算进去,导致文字没精准贴合边缘。下面是四个方向的精准命令,我都帮你适配了文字尺寸,保证从边缘滑到边缘:
1. 右下角 → 左上角
这个方向要让文字从右下角(刚好完全显示)滑到左上角(刚好完全消失),命令里的duration是你希望动画持续的总时长(比如5秒,你可以自己改):
ffmpeg -i "tmp/output_2.mp4" -vf "drawtext='fontfile=DejaVu Sans:text=HelloWorld:fontcolor=white:fontsize=30:y=h-th-(t/duration)*(h-th):x=w-tw-(t/duration)*(w-tw)'" -vcodec libx264 -crf 15 "tmp/watermark_output_2.mp4"
解释:初始位置y=h-th(文字底部和视频底部对齐)、x=w-tw(文字右侧和视频右侧对齐),随着时间t增加,x和y逐渐减小,直到t=duration时,x和y都变成0(文字左上角对齐视频左上角,刚好完全滑出)。
2. 左上角 → 右下角
从左上角完全显示,滑到右下角完全消失:
ffmpeg -i "tmp/output_2.mp4" -vf "drawtext='fontfile=DejaVu Sans:text=HelloWorld:fontcolor=white:fontsize=30:y=0+(t/duration)*(h-th):x=0+(t/duration)*(w-tw)'" -vcodec libx264 -crf 15 "tmp/watermark_output_3.mp4"
解释:初始位置y=0、x=0(文字左上角对齐视频左上角),随着时间增加,x和y逐渐增大,直到t=duration时,x=w-tw、y=h-th(文字右下角对齐视频右下角,刚好滑出)。
3. 右上角 → 左下角
从右上角完全显示,滑到左下角完全消失:
ffmpeg -i "tmp/output_2.mp4" -vf "drawtext='fontfile=DejaVu Sans:text=HelloWorld:fontcolor=white:fontsize=30:y=0+(t/duration)*(h-th):x=w-tw-(t/duration)*(w-tw)'" -vcodec libx264 -crf 15 "tmp/watermark_output_4.mp4"
解释:初始位置y=0、x=w-tw(文字右上角对齐视频右上角),y随时间增大,x随时间减小,直到t=duration时,x=0、y=h-th(文字左下角对齐视频左下角,刚好滑出)。
4. 左下角 → 右上角
从左下角完全显示,滑到右上角完全消失:
ffmpeg -i "tmp/output_2.mp4" -vf "drawtext='fontfile=DejaVu Sans:text=HelloWorld:fontcolor=white:fontsize=30:y=h-th-(t/duration)*(h-th):x=0+(t/duration)*(w-tw)'" -vcodec libx264 -crf 15 "tmp/watermark_output_5.mp4"
解释:初始位置y=h-th、x=0(文字左下角对齐视频左下角),y随时间减小,x随时间增大,直到t=duration时,x=w-tw、y=0(文字右上角对齐视频右上角,刚好滑出)。
你只需要把命令里的duration替换成你想要的动画时长(比如5就代表5秒完成滑动),如果需要调整动画的起始时间,还可以加enable='between(t,start_time,end_time)'参数,比如enable='between(t,2,7)'就代表从第2秒开始到第7秒结束动画。
备注:内容来源于stack exchange,提问作者Raymond

