背景
工作中遇到的呗。记下来贡着。
滤镜重置时间戳:setpts=PTS-STARTPTS
在FFmpeg中,setpts=PTS-STARTPTS
是一种用于调整视频时间戳(PTS)的滤镜表达式。这个表达式通常用于视频编辑和处理过程中,用于修改视频的时间轴。
让我们解释一下这个表达式的各个部分:
PTS
:表示当前帧的原始时间戳(针对滤镜的输入而言,而非原始文件)。时间戳是用于确定视频中每一帧的时刻的数值。在ffmpeg执行过程中,这是个动态值!
STARTPTS
:表示流的开始时间戳。这是输入流的第一帧的时间戳。在一个处理链中,STARTPTS用于引用流的初始时间戳,而不是每一帧的时间戳。这是个确定的值,等于滤镜拿到的「视频流的开始时间戳」,在ffmpeg执行过程中,恒定不变。这里强调一下,滤镜内trim
指定的起始时间(不指定则默认0)如果还没有出现视频流,则STARTPTS
会一直向后找到视频流,把遇到的首帧时间戳作为其值。
PTS-STARTPTS
(相减):这部分表示当前帧相对于开始时间戳的偏移量。使用这个表达式会将视频的时间轴重新设置,以使第一帧的时间戳为零,后续帧的时间戳相对于第一帧进行调整。
setpts
:这是一个滤镜指令,用于设置帧的新时间戳。通过将setpts
与PTS-STARTPTS
结合使用,可以重新计算和调整视频帧的时间戳。
综合起来,setpts=PTS-STARTPTS
的效果是将视频的时间轴重新调整,使第一帧的时间戳为零,后续帧相对于第一帧进行相应的时间调整。这在一些视频处理场景中很有用,例如剪辑、拼接或进行时间轴变换。
另外,滤镜的输入,是-ss -t 等参数裁剪完之后的结果,这个结果的时间戳从0开始。所以对于滤镜来说,滤镜拿到的输入文件的时间戳总是起始于0。但是,视频流却未必起始于0。例如,-ss -t裁剪完,传给滤镜的文件 总时长10秒,但视频流只在7~10秒(也就是前7秒没画面),那么STARTPTS
值恒为7,PTS
值为变量,即每一帧的时间戳(起始于STARTPTS
)。
案例一:滤镜不重置时间戳
ffmpeg -ss 10 -stream_loop -1 -i dongwu_25min.mp4 -t 30 -filter_complex "[0:v]scale=1920:1080,trim=start=5.000000:duration=10.000,showinfo[node1_f2_media1]" -map "[node1_f2_media1]" -y output.mp4
注意:滤镜中的duration=10.000
会严格取视频流的持续时长,如有空白则跳过。
打印中间信息: