如何用FFmpeg实现文本在指定Y轴范围内滚动?
实现FFmpeg文本在指定Y轴范围内滚动
可以实现,下面提供两种直接可用的方案:
方法一:直接修改drawtext的Y轴表达式
通过嵌套的if条件表达式,精准控制文本在指定时间段内仅在目标Y轴区间滚动,到达边界后立即移出画面。
假设你需要的滚动参数:
- 起始位置(底部边界):
y=400(距离原视频底部140像素) - 终止消失位置(顶部边界):
y=100(距离原视频顶部100像素) - 滚动速度:40像素/秒
- 延迟2秒开始滚动
对应的FFmpeg命令:
ffmpeg -i vid.mp4 -vf "drawtext=fontfile=tahoma.ttf:fontsize=20:fontcolor=green:x=(w-text_w)/2+20:y=if(lt(t\,2)\,400\,if(lt(t\,9.5)\,400-40*(t-2)\,-text_h)):textfile=scroll.txt:bordercolor=white:borderw=1" -c:v libx264 -y -preset ultrafast scrolling.mp4
表达式逻辑:
lt(t\,2)\,400:前2秒文本固定在y=400的位置lt(t\,9.5)\,400-40*(t-2):2秒到9.5秒期间,文本以40像素/秒向上滚动(9.5=2+(400-100)/40,即滚动完300像素的耗时)-text_h:超过9.5秒后,将文本位置设为负的文本高度,确保完全移出画面
方法二:透明视频合成法(更灵活)
先在透明背景视频上生成独立的滚动文本层,再叠加到原视频上,适合需要单独调整文本层的场景:
- 生成与原视频匹配的透明背景视频
# 先获取原视频时长 VIDEO_DURATION=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 vid.mp4) # 创建带透明通道的背景视频 ffmpeg -f lavfi -i color=c=black@0:s=960x540:r=30:duration=$VIDEO_DURATION -c:v qtrle transparent_bg.mov
- 在透明视频上添加限定范围的滚动文本
ffmpeg -i transparent_bg.mov -vf "drawtext=fontfile=tahoma.ttf:fontsize=20:fontcolor=green:x=(w-text_w)/2+20:y=if(lt(t\,2)\,400\,if(lt(t\,9.5)\,400-40*(t-2)\,-text_h)):textfile=scroll.txt:bordercolor=white:borderw=1" -c:v qtrle scroll_text.mov
- 将文本层与原视频叠加
ffmpeg -i vid.mp4 -i scroll_text.mov -filter_complex "[0:v][1:v]overlay=0:0" -c:v libx264 -y -preset ultrafast final.mp4
调整说明
- 可根据需求修改
start_y(起始Y)、end_y(终止Y)、speed(滚动速度),并重新计算滚动结束时间(公式:2 + (start_y - end_y)/speed) text_h是drawtext滤镜的内置变量,代表文本块高度,用-text_h能确保文本完全移出可见区域- 若原视频帧率不是30,需调整透明视频生成命令中的
r参数
内容的提问来源于stack exchange,提问作者Yoav Mor
相关产品推荐
相关产品推荐

