如何让FFmpeg提取视频的时间水印从指定偏移量开始?
解决方案
方法1:保留快速截取(-ss在-i前),修正水印时间计算
当使用-ss "$startSecond" -i "$inputFile"时,FFmpeg会将截取片段的起始时间重置为0,因此需要在滤镜中把相对时间加上原视频的起始偏移量,才能显示原视频的真实时间戳。修改后的命令如下:
ffmpeg -ss "$startSecond" -i "$inputFile" -to "$endSecond" -vf "drawtext=text='%{expr\:pts + $startSecond\:hms}':fontfile=FreeSerif.ttf:fontsize=20:x=40:y=60:box=1:boxcolor=white@0.5:boxborderw=5" -c:v libx264 -crf 23 -preset medium -c:a libmp3lame -q:a 2 "$outputFile"
核心修改:将原%{pts\:hms}替换为%{expr\:pts + $startSecond\:hms},通过FFmpeg的表达式计算,把截取片段的相对时间(pts)加上起始偏移量$startSecond,得到原视频的绝对时间戳,再用hms格式化为时分秒格式。
方法2:慢截取但无需额外计算(-ss在-i后)
如果不追求截取速度,可以将-ss放在-i之后,此时FFmpeg会保留原视频的时间戳,滤镜中的pts直接对应原视频的时间,无需额外计算:
ffmpeg -i "$inputFile" -ss "$startSecond" -to "$endSecond" -vf "drawtext=text='%{pts\:hms}':fontfile=FreeSerif.ttf:fontsize=20:x=40:y=60:box=1:boxcolor=white@0.5:boxborderw=5" -c:v libx264 -crf 23 -preset medium -c:a libmp3lame -q:a 2 "$outputFile"
注意:这种方式需要FFmpeg从头读取视频到起始位置,大文件下截取速度会明显变慢。
关键滤镜规则说明
FFmpeg的drawtext滤镜支持通过变量和表达式生成动态文本,核心规则包括:
%{pts:fmt}:获取当前帧的显示时间戳(Presentation Timestamp),fmt指定输出格式,hms对应时分秒格式(如00:01:23)。%{expr:expression:fmt}:执行数学表达式计算结果后按指定格式输出,支持加减乘除等基本运算。
内容的提问来源于stack exchange,提问作者Marcipicus
相关产品推荐
相关产品推荐

