FFmpeg分割视频段时长不符且drawtext不生效问题求助
问题分析与解决方案
我来帮你拆解这三个核心问题:片段时长波动、Past duration警告,以及drawtext滤镜不生效,逐个给你针对性的解决办法:
1. 片段时长不准与Past duration警告
你用-f segment分割视频时,FFmpeg默认会对齐关键帧完成切割——它不会在非关键帧的位置硬切,而是等下一个关键帧出现才结束当前片段,这就直接导致了时长偏离设置的segment_time 10,同时触发时间戳不匹配的Past duration警告。
解决办法:强制按时间间隔生成关键帧
在命令里添加-force_key_frames "expr:gte(t,n_forced*10)",强制FFmpeg每10秒生成一个关键帧,这样segment就能精准地在10秒左右的位置切割,误差会完全控制在你能接受的范围内。
2. drawtext滤镜未生效
你的drawtext参数存在几个明显问题:
start_number=0是segment格式的专属参数,不是drawtext的配置项,你把它放错位置会导致drawtext解析出错;- 没有指定字体路径,FFmpeg可能找不到可用的字体来渲染文本;
- 默认白色文本如果遇到浅色视频背景,会完全融合看不到效果。
修正后的drawtext参数示例
把start_number移到segment相关参数区,同时给drawtext指定字体、颜色,还能让它显示对应片段的序号:
-vf "drawtext=fontfile=/path/to/your/font.ttf:text='teste %{segment_index}':x=10:y=10:fontsize=24:fontcolor=black"
fontfile:替换成你系统里实际的字体路径,比如Windows下可以用C:/Windows/Fonts/arial.ttf;%{segment_index}:会自动显示当前片段的序号(从0开始,和start_number=0对应);fontcolor=black:确保文本和背景有足够对比度,避免被遮挡。
完整修正后的命令
把所有调整整合起来,最终命令如下:
ffmpeg -y -i teste.mp4 -map 0 -segment_time 10 -f segment -start_number 0 -force_key_frames "expr:gte(t,n_forced*10)" -c:v libx264 -preset veryfast -crf 24 -tune film -vf "drawtext=fontfile=C:/Windows/Fonts/arial.ttf:text='teste %{segment_index}':x=10:y=10:fontsize=24:fontcolor=black" -an teste\out%d.mp4
说明:
-start_number 0:指定输出文件的序号从0开始,和drawtext里的%{segment_index}对应;-force_key_frames确保每10秒生成关键帧,分割时长更稳定;- 修正后的drawtext参数能正常渲染带有序号的文本。
额外注意事项
如果还是存在1-2秒的微小时长误差,这是视频编码的时间戳特性导致的正常现象,完全符合你能接受的误差范围。
内容的提问来源于stack exchange,提问作者Rafael Lima
相关产品推荐
相关产品推荐

